在 C++ 中转换 big-endian long?

Conversion of big-endian long in C++?

我需要一个 C++ 函数,该函数 returns 四个连续字节的值被解释为 bigendian long。指向第一个字节的指针应更新为指向最后一个字节之后。我试过以下代码:

inline int32_t bigendianlong(unsigned char * &p)  
{  
  return (((int32_t)*p++ << 8 | *p++) << 8 | *p++) << 8 | *p++;  
}  

例如,如果 p 指向 00 00 00 A0,我希望结果是 160,但它是 0。怎么会?

这个警告(由编译器发出)清楚地解释了这个问题:

./endian.cpp:23:25: warning: multiple unsequenced modifications to 'p' [-Wunsequenced]
    return (((int32_t)*p++ << 8 | *p++) << 8 | *p++) << 8 | *p++;

分解函数中的逻辑以明确指定序列点...

inline int32_t bigendianlong(unsigned char * &p)
{
    int32_t result = *p++;
    result = (result << 8) + *p++;
    result = (result << 8) + *p++;
    result = (result << 8) + *p++;
    return result;
}

...会解决的

此函数在 Unix 和 Windows 上都被命名为 ntohl()(将网络字节序转换为长字节序),或者在 glib 中被命名为 g_ntohl()。之后将 4 添加到您的指针。如果您想自己推出,成员为 uint32_tuint8_t[4] 的联合类型将很有用。