我正在尝试将二进制文件读入C#结构。该文件是从C创建的,以下代码在50+字节行中创建了2个字节。
unsigned short nDayTimeBitStuffed = atoi( LPCTSTR( strInput) );
unsigned short nDayOfYear = (0x01FF & nDayTimeBitStuffed);
unsigned short nTimeOfDay = (0x01F & (nDayTimeBitStuffed >> 9) );
文件上的二进制值为00000001
和00000100
。
预期值为1和2,所以我认为有些位排序/交换正在进行但不确定。
非常感谢任何帮助。
谢谢!
答案 0 :(得分:2)
答案是“它取决于” - 最明显的是在机器上,以及数据如何写入文件。考虑:
unsigned short x = 0x0102;
write(fd, &x, sizeof(x));
在某些机器(Intel)上,低位字节(0x02)将在高位字节(0x01)之前写入;在其他人(PPC,SPARC)上,高位字节将在低位字节之前写入。
因此,从小端(Intel)机器上,你会看到字节:
0x02 0x01
但是从big-endian(PPC)机器,你会看到字节:
0x01 0x02
您的字节似乎是0x01和0x04。您对0x02的计算显示有缺陷。
您显示的C代码不会写任何内容。 nDayOfYear中的值是输入值的底部9位; nTimeOfDay似乎是接下来的5位(因此使用了16位中的14位)。
例如,如果strInput中的值是12141十进制,0x2F6D,则nDayOfYear中的值将为365(0x16D),nTimeOfDay中的值将为23(0x17)。
这是一个有趣的存储订单;你不能简单地比较这两个值,而如果你把一年中的一天打包在值和时间的较重要部分中,那么你可以将值作为简单的整数进行比较并得到正确的比较。
答案 1 :(得分:0)
预期的文件内容与用于创建文件的处理器和编译器非常相关,如果它是二进制的。
我在这里假设一台Windows机器,它使用2个字节作为短路并以小端顺序放置。
你的评论也没有多大意义。如果它是两个字节,那么它应该使用两个字符,而不是短路。第一个的范围将是1-365,因此它肯定需要多于一个字节来表示。我假设你想要前4个字节,而不是前2个字节。
这意味着第一个字节将是DayOfYear的第0-7位,第二个字节将是DayOfYear的第8-15位,第三个字节将是TimeOfDay的第0-7位,第四个字节将是是TimeOfDay的8-15位。