十六进制数C#

pin*_*ker 9 c# hex

我试图在C#中读取二进制文件,但我遇到了问题.我宣布了以下内容:

public static readonly UInt32 NUMBER = 0XCAFEBABE;
Run Code Online (Sandbox Code Playgroud)

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

UInt32 num = in_.ReadUInt32(); // in_ is a BinaryReader
Run Code Online (Sandbox Code Playgroud)

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

byte[] f2 = {0xCA, 0xFE, 0xBA, 0xBE};
Run Code Online (Sandbox Code Playgroud)

这样做的结果BitConverter.ToUInt32(new byte[]{0xCA, 0xFE, 0xBA, 0xBE},0)是3199925962.

谁能帮我?

谢谢

Tho*_*rin 8

这是因为您的机器的端点很小.查看BitConverter.IsLittleEndian属性以查看此信息.

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

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

uint value = (f2[0] << 24) | (f2[1] << 16) | (f2[2] << 8) | f2[3];
Run Code Online (Sandbox Code Playgroud)

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

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

uint num = (uint)IPAddress.NetworkToHostOrder(in_.ReadInt32());
Run Code Online (Sandbox Code Playgroud)

但是,这可能会导致算术下溢,因此可能会导致/checked编译器选项或checked关键字出现问题(两者都不常见).

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

public static uint ReadUInt32NetworkOrder(this BinaryReader reader)
{
    unchecked
    {
        return (uint)IPAddress.NetworkToHostOrder(reader.ReadInt32());    
    }
}
Run Code Online (Sandbox Code Playgroud)