C# - 将uint转换为byte []

Joe*_*tti 11 c# bytearray

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

有没有更好的方法来处理这个而不仅仅是使用linq来反转字节数组?

lep*_*pie 5

Array.Reverse 改变结束.


C8H*_*4O2 5

Microsoft 在BitConverter的文档页面上讨论了 GetBytes() 方法的小端/大端问题。


Chr*_*lor 5

如果要在平台体系结构之间切换,则仅在一个平台上反转阵列可能是正确的,但在已经使用大端字节序的平台上失败。

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

uint number = 234234233;
uint bigEndian = (uint)IPAddress.HostToNetworkOrder((int)number);
byte[] b = BitConverter.GetBytes(bigEndian);
Run Code Online (Sandbox Code Playgroud)


Joe*_*tti 3

所以我发现我的困惑很大一部分与此有关:IsLittleEndian 字段报告错误,但它必须是 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();
    }
}
Run Code Online (Sandbox Code Playgroud)