在 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_t
和 uint8_t[4]
的联合类型将很有用。
我需要一个 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_t
和 uint8_t[4]
的联合类型将很有用。