<分区>
如何在 C++ 中的大端值和小端值之间进行转换? 我正在使用 VC++ 6.0。当我使用 _byteswap_ulong() 函数时,它需要头文件 intrin.h。 当我包含 header 时,它会报告一个错误,指出编译器不兼容,并且 intrin.h 用于 gcc 编译器。 那么VC++中除了这个函数还有其他函数可以实现大端值和小端值之间的转换吗?
<分区>
如何在 C++ 中的大端值和小端值之间进行转换? 我正在使用 VC++ 6.0。当我使用 _byteswap_ulong() 函数时,它需要头文件 intrin.h。 当我包含 header 时,它会报告一个错误,指出编译器不兼容,并且 intrin.h 用于 gcc 编译器。 那么VC++中除了这个函数还有其他函数可以实现大端值和小端值之间的转换吗?
最佳答案
在 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);
正如名称(host-to-network-long、host-to-network-short 等)所暗示的那样,它们专门用于网络使用
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 指令。 __builtin_bswap64
在 GCC 和 ICC 中。从 VS7.0 开始,VS 中就有类似的东西。
关于c++ - 如何在 C++ 中的大端值和小端值之间进行转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/648177/