如何在C+中的大端值和小端点值之间进行转换?如何在C+中的大端值和小端点值之间进行转换?编辑:为了清晰起见,我必须将二进制数据(双精度浮点值和32位和64位整数)从一个CPU体系结构转换到另一个CPU体系结构。这不涉及联网,因此Ntoh()和类似的函数在这里不能工作。编辑2:我接受的答案直接适用于我正在获取的编译器(这就是我选择它的原因)。然而,这里还有其他更好、更便携的答案。
3 回答
沧海一幻觉
TA贡献1824条经验 获得超5个赞
unsigned short _byteswap_ushort(unsigned short value);
unsigned long _byteswap_ulong(unsigned long value);
unsigned __int64 _byteswap_uint64(unsigned __int64 value);
int32_t __builtin_bswap32 (int32_t x)int64_t __builtin_bswap64 (int64_t x)
幕布斯6054654
TA贡献1876条经验 获得超7个赞
#include <climits>template <typename T>T swap_endian(T u){ static_assert (CHAR_BIT == 8, "CHAR_BIT != 8"); union { T u; unsigned char u8[sizeof(T)]; } source, dest; source.u = u; for (size_t k = 0; k < sizeof(T); k++) dest.u8[k] = source.u8[sizeof(T) - k - 1]; return dest.u;}
swap_endian<uint32_t>(42)
.
拉莫斯之舞
TA贡献1820条经验 获得超10个赞
假设您的数据流有一个端编码的32位整数。下面是如何提取它(假设没有签名的字节):
i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);
如果它是大端,下面是如何提取它:
i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);
TL;DR:
data
unsigned char
uint8_t
signed char
char
data[x]
data[x] << 24
- 3 回答
- 0 关注
- 1844 浏览
添加回答
举报
0/150
提交
取消