如何在C ++中的big-endian和little-endian值之间进行转换? 我正在使用VC ++ 6.0。当我使用_byteswap_ulong()函数时,它需要头文件intrin.h。 当我包含标题时,它报告错误说不兼容的编译器,而intrin.h用于gcc编译器。 那么除了这个函数之外,还有其他函数可以在VC ++中的big-endian和little-endian值之间进行转换吗?
答案 0 :(得分:8)
在POSIX兼容系统中,您具有标准的byteswap(3)函数:
#include <arpa/inet.h>
uint32_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
#include <endian.h>
uint16_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指令一样。 GCC和ICC __builtin_bswap64
。自VS7.0起,VS中就有类似的东西了。
答案 1 :(得分:1)
Docs似乎说这些函数存在于stdlib.h中。