当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在C++中的big-endian和little-endian值之间进行转换?》经验,为你挑选了1个好方法。

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



1> greyfade..:

在POSIX兼容系统中,您具有标准的byteswap(3)函数:

#include 

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 

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中有类似的东西.

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有