c++ - 如何在 C++ 中的大端值和小端值之间进行转换?

标签 c++ visual-studio bytecode-manipulation

<分区>

如何在 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/

相关文章:

c++ - 对某些 OpenGL 函数的 undefined reference (如果它们尚未在 main 中调用)

c++ - 模板内的模板 VS 2005 问题?

visual-studio - 当我在 SSRS 中部署报表时,如何修复在 TablixRowHierarchy 中错误设置 FixedData 属性的错误?

java - 字节码操作的危险是什么(如果有的话)?

java - 在 Java 字节码中向函数添加参数

c++ - 使用来自 asm 的引用参数调用 C++ 成员函数

c++ - 用于读取文本文件 C++ 的标准循环

c++ - 结构类型 "does not provide a subscript operator"

visual-studio - 加载从TFS服务器检索的项目时,如何解决错误消息 “an error occurred registering this project with source control”?

python - 将 Python 字节码重新组装成原始代码?