当将char *转换为unsigned short *和dereference时,字节序列会发生变化?

时间:2013-03-15 04:20:52

标签: c

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]。问题是什么?谢谢。

4 个答案:

答案 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函数以主机字节顺序返回值。如果传递的参数已经是主机字节顺序,则此函数将反转它。由应用程序决定是否必须反转字节顺序。