unsigned short* pname = (unsigned short*)(buf + buf_offset);/*sequence problem?*/
unsigned short pointer_offset = ntohs(*pname) & COMPRESSION_MASK;
这里,buf_offset == 0.buf的内容是[c0] [0c]。但是,* pname是[0x0cc0]。问题是什么?谢谢。
答案 0 :(得分:0)
它取决于您的平台,big-endian / little-endian 你应该改变字节顺序。
#ifdef _BIG_ENDIAN_
// revers bytes order
#endif
答案 1 :(得分:0)
ntohs()将字节顺序交换为big endian
答案 2 :(得分:0)
正如其他人所指出的那样,您发布的代码不可移植。这不仅仅是因为字节序的原因。由于无效对齐,从char *
投射到unsigned short *
也可能导致bus errors。此外,unsigned short
中的填充位可能导致程序出现异常,或unsigned short
可能小于或大于“2字节”,具体取决于CHAR_BIT
和选项实现。总体问题是类型的内部表示,您可以通过使用行为相同的运算符来避免此问题,而不管内部表示如何。也许你的意思是:
unsigned short offset = (unsigned char) buf[0];
offset *= (UCHAR_MAX + 1);
offset += (unsigned char) buf[1];
offset &= COMPRESSION_MASK;
如果你想要大端,你必须明确说明你想要它。通过乘以buf[0]
和添加buf[1]
,我指定buf[0]
比buf[1]
更重要,因此我明确指出我想要大端。乘法和加法在每个C实现中都是相同的,并且没有对齐问题。
扭转转化:
unsigned char buf[2] = { offset / (UCHAR_MAX + 1), offset % (UCHAR_MAX + 1) };
很高兴看到更多的代码在没有内部表示的情况下编写!
答案 3 :(得分:0)
正如加布里埃尔所说,
ntohs()将u_short从TCP / IP网络字节顺序转换为主机字节顺序(在Intel处理器上为little-endian)。
ntohs函数以主机字节顺序返回值。如果传递的参数已经是主机字节顺序,则此函数将反转它。由应用程序决定是否必须反转字节顺序。