十六进制数字C#

参见英文答案 > Why does BinaryReader.ReadUInt32() reverse the bit pattern?                                    6个
我试图在C#中读取二进制文件,但我遇到了问题.
我宣布了以下内容:

public static readonly UInt32 NUMBER = 0XCAFEBABE;

然后在从文件的最开头读取时我要求读取前4个字节(已尝试过不同的方法,但这是最简单的):

UInt32 num = in_.ReadUInt32(); // in_ is a BinaryReader

虽然我有4个字节是CA,FE,BA和BE(十六进制),同时将它们转换为UInt我得到不同的值. NUMBER是3405691582,num是3199925962.
我也试过这样做:

byte[] f2 = {0xCA, 0xFE, 0xBA, 0xBE};

并且执行BitConverter.ToUInt32(new byte [] {0xCA,0xFE,0xBA,0xBE},0)的结果是3199925962.

谁能帮我?

谢谢

最佳答案
这是因为您的机器很小的endianness.请参阅BitConverter.IsLittleEndian属性以查看此信息.

基本上,数字以反向字节顺序存储,与将它们写下来的方式相比.我们在左边写了最重要的数字,但是(小端)PC在左边存储了最低有效字节.因此,你得到的结果实际上是0xBEBAFECA(十进制3199925962),而不是你所期望的.

您可以使用位移操作进行转换:

uint value = (f2[0] << 24) | (f2[1] << 16) | (f2[2] << 8) | f2[3];

还有很多转换方法,包括I4V指出的IPAddress.NetworkToHostOrder,f2.Reverse()等.

对于您的特定代码,我相信这是最实用的:

uint num = (uint)IPAddress.NetworkToHostOrder(in_.ReadInt32());

但是,这可能会导致算术下溢,因此可能会导致/checked compiler option or checked keyword出现问题(两者都不常见).

如果您想处理这些情况并获得更清晰的代码,请将其包装在扩展方法中:

public static uint ReadUInt32NetworkOrder(this BinaryReader reader)
{
    unchecked
    {
        return (uint)IPAddress.NetworkToHostOrder(reader.ReadInt32());    
    }
}

转载注明原文:十六进制数字C# - 代码日志