如何将值存储在C unsigned short中?

时间:2010-10-27 03:38:39

标签: c binary

我正在尝试将二进制文件读入C#结构。该文件是从C创建的,以下代码在50+字节行中创建了2个字节。

unsigned short nDayTimeBitStuffed = atoi( LPCTSTR( strInput) );
unsigned short nDayOfYear         = (0x01FF & nDayTimeBitStuffed);
unsigned short nTimeOfDay         = (0x01F  & (nDayTimeBitStuffed >> 9) );

文件上的二进制值为0000000100000100

预期值为1和2,所以我认为有些位排序/交换正在进行但不确定。

非常感谢任何帮助。

谢谢!

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位。