猿问

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

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

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

编辑:为了清晰起见,我必须将二进制数据(双精度浮点值和32位和64位整数)从一个CPU体系结构转换到另一个CPU体系结构。这不涉及联网,因此Ntoh()和类似的函数在这里不能工作。

编辑2:我接受的答案直接适用于我正在获取的编译器(这就是我选择它的原因)。然而,这里还有其他更好、更便携的答案。


慕容3067478
浏览 1845回答 3
3回答

沧海一幻觉

如果你用Visual C+执行以下操作:包含in.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位数字(字符)不需要转换。此外,这些也只为它们为有符号整数工作的无符号值定义。对于浮点数和双面数,就像普通整数一样,难度更大,因为这些整数可能是按主机字节顺序排列的,也可能不按字节顺序排列。你可以在大端机器上得到小终端浮点数,反之亦然.其他编译器也有类似的本质。在……里面GCC例如,您可以直接调用:int32_t __builtin_bswap32 (int32_t x)int64_t __builtin_bswap64 (int64_t x)(不需要包括什么)。h也以一种非GCC中心的方式声明相同的函数。16位交换,只是一点点旋转。调用本质,而不是滚动自己的,给你最好的性能和代码密度,顺便说一句。

幕布斯6054654

简单地说:#include&nbsp;<climits>template&nbsp;<typename&nbsp;T>T&nbsp;swap_endian(T&nbsp;u){ &nbsp;&nbsp;&nbsp;&nbsp;static_assert&nbsp;(CHAR_BIT&nbsp;==&nbsp;8,&nbsp;"CHAR_BIT&nbsp;!=&nbsp;8"); &nbsp;&nbsp;&nbsp;&nbsp;union &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;u; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;u8[sizeof(T)]; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;source,&nbsp;dest; &nbsp;&nbsp;&nbsp;&nbsp;source.u&nbsp;=&nbsp;u; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(size_t&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;<&nbsp;sizeof(T);&nbsp;k++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dest.u8[k]&nbsp;=&nbsp;source.u8[sizeof(T)&nbsp;-&nbsp;k&nbsp;-&nbsp;1]; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dest.u;}用法:swap_endian<uint32_t>(42).

拉莫斯之舞

从…拜德秩序谬误罗布·派克:假设您的数据流有一个端编码的32位整数。下面是如何提取它(假设没有签名的字节):i&nbsp;=&nbsp;(data[0]<<0)&nbsp;|&nbsp;(data[1]<<8)&nbsp;|&nbsp;(data[2]<<16)&nbsp;|&nbsp;(data[3]<<24);如果它是大端,下面是如何提取它:i&nbsp;=&nbsp;(data[3]<<0)&nbsp;|&nbsp;(data[2]<<8)&nbsp;|&nbsp;(data[1]<<16)&nbsp;|&nbsp;(data[0]<<24);TL;DR:不要担心您的平台原生顺序,所有重要的是您正在读取的流的字节顺序,您最好希望它有良好的定义。注:注释中指出,如果没有显式类型转换,则重要的是data是一个数组unsigned char或uint8_t..使用signed char或char(如果签署)将导致data[x]被提升为整数和data[x] << 24可能将1移动到符号位,即UB。
随时随地看视频慕课网APP
我要回答