如何在C ++中的big-endian和little-endian值之间进行转换?

时间:2009-03-15 17:21:41

标签: c++ visual-studio bytecode-manipulation

如何在C ++中的big-endian和little-endian值之间进行转换? 我正在使用VC ++ 6.0。当我使用_byteswap_ulong()函数时,它需要头文件intrin.h。 当我包含标题时,它报告错误说不兼容的编译器,而intrin.h用于gcc编译器。 那么除了这个函数之外,还有其他函数可以在VC ++中的big-endian和little-endian值之间进行转换吗?

2 个答案:

答案 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中。