如何在C++中的big-endian和little-endian值之间进行转换?我正在使用VC++ 6.0.当我使用_byteswap_ulong()函数时,它需要头文件intrin.h.当我包含标题时,它报告错误说不兼容的编译器,而intrin.h用于gcc编译器.那么除了这个函数之外,还有其他函数可以在VC++中的big-endian和little-endian值之间进行转换吗?
在POSIX兼容系统中,您具有标准的byteswap(3)函数:
#includeuint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort);
这些专门用于网络使用,如名称所示(主机到网络长,主机到网络短等)
GNU和BSD系统还提供endian(3)函数:
#define _BSD_SOURCE #includeuint16_t htobe16(uint16_t host_16bits); uint16_t htole16(uint16_t host_16bits); uint16_t be16toh(uint16_t big_endian_16bits); uint16_t le16toh(uint16_t little_endian_16bits); uint32_t htobe32(uint32_t host_32bits); uint32_t htole32(uint32_t host_32bits); uint32_t be32toh(uint32_t big_endian_32bits); uint32_t le32toh(uint32_t little_endian_32bits); uint64_t htobe64(uint64_t host_64bits); uint64_t htole64(uint64_t host_64bits); uint64_t be64toh(uint64_t big_endian_64bits); uint64_t le64toh(uint64_t little_endian_64bits);
(在OpenBSD上,位宽的数字总是在函数的末尾:例如,be64toh()与betoh64()相比.)
否则,大多数人定义自己的宏或函数:
#define bswap16(x) ((x)>>8 | ((x)&255)<<8) #deinfe bswap32(x) ((bswap16((x)>>16)&65535)|(bswap16((x)&65535)<<16)) /* etc. */
您也可以使用程序集内在函数,就像x86上的bswap指令一样.__builtin_bswap64
在GCC和ICC.自VS7.0以来,VS中有类似的东西.