C# - 将uint转换为byte []

时间:2010-08-03 05:06:44

标签: c# bytearray

所以我使用BitConverter.GetBytes()将uint32转换为byte [],但我的数组中的顺序似乎是向后的。 http://msdn.microsoft.com/en-us/library/1184xdy4.aspx (显示它的byte []似乎是小端)。

除了使用linq来反转字节数组之外,还有更好的方法吗?

5 个答案:

答案 0 :(得分:5)

答案 1 :(得分:5)

如果您要在平台架构之间移动,只需在一个平台上反转阵列可能是正确的,但在已经使用大端的平台上失败。

您使用IPAddress.HostToNetworkOrder函数,这将确保数据始终处于网络顺序(大端)。

uint number = 234234233;
uint bigEndian = (uint)IPAddress.HostToNetworkOrder((int)number);
byte[] b = BitConverter.GetBytes(bigEndian);

答案 2 :(得分:4)

Microsoft在BitConverter的文档页面上讨论了使用GetBytes()方法的little-endian / big-endian问题。

答案 3 :(得分:2)

所以我发现我的困惑很大一部分与此有关:IsLittleEndian field reports false, but it must be Little-Endian?

我最终做的是用调用包装所有BitConverter调用,该调用带有额外的参数来指定字节顺序,然后添加一个被调用的函数来检查字节是否需要被尊重。

public static class BitEndianConverter
{
    public static byte[] GetBytes(bool value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }

    public static byte[] GetBytes(char value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(double value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(float value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(int value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(long value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(short value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(uint value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(ulong value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(ushort value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }

    private static byte[] ReverseAsNeeded(byte[] bytes, bool wantsLittleEndian)
    {
        if (wantsLittleEndian == BitConverter.IsLittleEndian)
            return bytes;
        else
            return (byte[])bytes.Reverse().ToArray();
    }
}

答案 4 :(得分:1)

以下是一种始终快速获取大端字节数组的方法。

    public static byte[] GetBigEndianBytes(UInt32 val, bool isLittleEndian)
    {
        UInt32 bigEndian = val;
        if (isLittleEndian)
        {
            bigEndian = (val & 0x000000FFU) << 24 | (val & 0x0000FF00U) << 8 |
                 (val & 0x00FF0000U) >> 8 | (val & 0xFF000000U) >> 24;
        }
        return BitConverter.GetBytes(bigEndian);
    }

这种重载可能很方便,但在跨具有不同字符串的计算机上工作时必须小心。

    public static byte[] GetBigEndianBytes(UInt32 val)
    {
        return GetBigEndianBytes(val, BitConverter.IsLittleEndian);
    }