如何在 C++ 中的 big-endian 和 little-endian 值之间进行转换?
为清楚起见,我必须将二进制数据( double 浮点值以及 32 位和 64 位整数)从一种 CPU 架构转换为另一种架构。这不涉及网络,所以 ntoh() 和类似的函数在这里不起作用。
注意:我接受的答案直接适用于我的目标编译器(这就是我选择它的原因)。但是,这里还有其他非常好的、更便携的答案。
最佳答案
如果您使用的是 Visual C++ ,请执行以下操作: 包含 intrin.h 并调用以下函数:
对于 16 位数字:
unsigned short _byteswap_ushort(unsigned short value);
对于 32 位数字:
unsigned long _byteswap_ulong(unsigned long value);
对于 64 位数字:
unsigned __int64 _byteswap_uint64(unsigned __int64 value);
8 位数字(字符)不需要转换。
此外,这些仅针对无符号值定义,它们也适用于有符号整数。
对于浮点数和 double 数,它与普通整数一样困难,因为它们可能在主机字节顺序中,也可能不在。您可以在大端机器上获得小端浮点数,反之亦然。
其他编译器也有类似的内在函数。
例如,在 GCC 中,您可以直接调用 some builtins as documented here :
uint32_t __builtin_bswap32 (uint32_t x)
uint64_t __builtin_bswap64 (uint64_t x)
(无需包含某些内容)。 Afaik bits.h 也以非以 gcc 为中心的方式声明了相同的函数。
16 位交换它只是位旋转。
调用内部函数而不是滚动自己的内部函数可以为您提供最佳性能和代码密度 btw..
关于c++ - 如何在 C++ 中的 big-endian 和 little-endian 值之间进行转换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/105252/