我试图在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.
谁能帮我?
谢谢
这是因为您的机器的端点很小.查看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)
| 归档时间: |
|
| 查看次数: |
83972 次 |
| 最近记录: |