C# 将十六进制数转换为UInt C的值不正确#

C# 将十六进制数转换为UInt C的值不正确#,c#,hex,C#,Hex,我试图用C#读取二进制文件,但遇到了一个问题。 我宣布如下: public static readonly UInt32 NUMBER = 0XCAFEBABE; 然后,在从文件的最开始读取时,我要求读取前4个字节(已经尝试了不同的方法,但这是最简单的): 当我将4个字节转换为UInt时,我得到了不同的值。号码是3405691582,号码是3199925962。 我也试着这样做: byte[] f2 = {0xCA, 0xFE, 0xBA, 0xBE}; 执行BitConverter.ToU

我试图用C#读取二进制文件,但遇到了一个问题。 我宣布如下:

public static readonly UInt32 NUMBER = 0XCAFEBABE;
然后,在从文件的最开始读取时,我要求读取前4个字节(已经尝试了不同的方法,但这是最简单的):

当我将4个字节转换为
UInt
时,我得到了不同的值。号码是3405691582,号码是3199925962。 我也试着这样做:

byte[] f2 = {0xCA, 0xFE, 0xBA, 0xBE};
执行
BitConverter.ToUInt32(新字节[]{0xCA,0xFE,0xBA,0xBE},0)
的结果是3199925962


有人能帮我吗?

这是因为你的机器太小了。请参阅属性以检查此项

基本上,数字是以相反的字节顺序存储的,而不是以相反的方式写下来。我们将最高有效数字写在左边,但(小端)PC将最低有效字节存储在左边。因此,您得到的结果实际上是
0xBEBAFECA
(3199925962十进制),而不是您预期的结果

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

uint value = (f2[0] << 24) | (f2[1] << 16) | (f2[2] << 8) | f2[3];
但是,这可能会导致算术下溢,因此可能会导致a出现问题(两者都不是很常见)

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

public static uint ReadUInt32NetworkOrder(this BinaryReader reader)
{
    unchecked
    {
        return (uint)IPAddress.NetworkToHostOrder(reader.ReadInt32());    
    }
}
这就是所谓的:


您是否尝试过
byte[]f2={0xBE,0xBA,0xFE,0xCA}
CAFEBABE
,这是一个热门数字:D
IPAddress.NetworkToHostOrder
@I4V我一直忘了那个方法。谁把它放在
IPAddress
类中。。。不幸的是,该方法没有UInt32版本,因此需要一些额外的修改。
IPAddress.NetworkToHostOrder
在IP协议数据包中IP地址的尾端(big-endian)和主机顺序(x86上的小尾端,但在ARM等其他体系结构上可能是big-endian)之间进行转换。不要养成使用此函数反转endianness的习惯,因为它不会跨平台工作。
uint num = (uint)IPAddress.NetworkToHostOrder(in_.ReadInt32());
public static uint ReadUInt32NetworkOrder(this BinaryReader reader)
{
    unchecked
    {
        return (uint)IPAddress.NetworkToHostOrder(reader.ReadInt32());    
    }
}
var result1 = BitConverter.ToUInt32(new byte[] { 0xCA, 0xFE, 0xBA, 0xBE }, 0);
//3199925962

var result2 = BitConverter.ToUInt32(new byte[] { 0xBE, 0xBA, 0xFE, 0xCA }, 0);
//3405691582