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

发布于 2024-07-15 06:53:38 字数 183 浏览 9 评论 0原文

如何在 C++ 中的大端和小端值之间进行转换? 我使用的是 VC++ 6.0。当我使用 _byteswap_ulong() 函数时,它需要头文件 intrin.h。 当我包含标头时,它会报告一个错误,指出编译器不兼容,并且 intrin.h 适用于 gcc 编译器。 那么除了这个函数之外,VC++中还有其他函数可以在大端和小端值之间进行转换吗?

How do I convert between big-endian and little-endian values in C++?
I'm using VC++ 6.0.when I used _byteswap_ulong() function it requires the header file intrin.h.
When I include the header it reports an error saying incompatible compiler and that intrin.h is for the gcc compiler.
So is there any other functions to convert between big-endian and little-endian values in VC++ other than this function?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

棒棒糖 2024-07-22 06:53:38

在符合 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 中也有类似的情况。

In POSIX-compliant systems, you have the standard byteswap(3) functions:

#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);

These are intended specifically for network use, as suggested by the name (host-to-network-long, host-to-network-short, etc.)

GNU and BSD systems also provide the endian(3) functions:

#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);

(On OpenBSD, the number for bit width is always at the end of the function: be64toh() vs. betoh64(), for example.)

Otherwise, most people define their own macros or functions:

#define bswap16(x) ((x)>>8 | ((x)&255)<<8)
#deinfe bswap32(x) ((bswap16((x)>>16)&65535)|(bswap16((x)&65535)<<16))
/* etc. */

You can also use assembly intrinsics, like with the bswap instruction on x86. __builtin_bswap64 in GCC and ICC. Something similar is in VS since VS7.0.

文档似乎说这些函数位于 stdlib.h 中。

The Docs seem to say these functions live in stdlib.h.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文