我有一个特殊的无符号长整数(32位),我需要一点一点地转换它的字节顺序 - 我的long代表几个所有的东西一起被整合成一个二进制文件。
我该怎么做?
答案 0 :(得分:3)
字节顺序是一个字级概念,其中字节要么首先存储在最高有效字节(大端),要么存储最低有效字节(小端)。通过网络传输的数据通常是大端(所谓的网络字节顺序)。存储在计算机内存中的数据可以按任意顺序排列,考虑到英特尔x86架构的普及,小端是最常见的。尽管大多数计算机体系结构都是大端,但x86无处不在,以至于你最常在内存中看到小端数据。
无论如何,关键在于字节序是一个非常具体的概念,只适用于字节级,而不是位级。如果ntohs()
,ntohl()
,htons()
和htonl()
没有达到您想要的效果,那么您所处理的内容本身并不是字节序。
如果您需要撤销无符号长线的各个位或执行其他任何复杂操作,请发布有关您需要做什么的更多信息。
答案 1 :(得分:3)
小心理解'endianness'的含义。它指的是数据中的字节顺序,而不是字节中的位。您可能只需要使用像htonl或ntohl这样的函数来转换您的d-word。
如果你真的想要颠倒32b数据类型中所有位的顺序,你可以编写一个迭代算法来屏蔽并将每个位移到适当的反射位置。
答案 2 :(得分:1)
unsigned long值的简单endianess转换函数可能如下所示:
typedef union {
unsigned long u32;
unsigned char u8 [ 4 ];
} U32_U8;
unsigned long SwapEndian(unsigned long u)
{
U32_U8 source;
U32_U8 dest;
source.u32 = u;
dest.u8[0] = source.u8[3];
dest.u8[1] = source.u8[2];
dest.u8[2] = source.u8[1];
dest.u8[3] = source.u8[0];
return dest.u32;
}
答案 3 :(得分:0)
要反转整数的位顺序,可以将位移出一个方向,然后将位移到相反方向的目标位置。