C端转换:逐位转换

我有一个特殊的无符号长整数(32位),我需要逐位转换它的字节顺序 – 我的long表示几个所有的东西都一起变成一个二进制文件。

我该怎么做?

字节顺序是一个字级概念,其中字节首先存储在最高有效字节(大端)或最低有效字节(小端)。 通过网络传输的数据通常是大端(所谓的网络字节顺序)。 存储在计算机内存中的数据可以按任意顺序排列,考虑到英特尔x86架构的普及,小端是最常见的。 尽管大多数计算机体系结构都是大端,但x86无处不在,以至于您最常在内存中看到小端数据。

无论如何,所有这一点的重点是字节序是一个非常具体的概念,只适用于字节级,而不是位级。 如果ntohs()ntohl()htons()htonl()没有做你想要的,那么你所处理的不是字节序本身。

如果你需要反转你的无符号长的各个位或做其他复杂的事情,请发布更多关于你究竟需要做什么的信息。

小心理解’endianness’的含义。 它指的是数据中的字节顺序,而不是字节中的位。 您可能只需要使用像htonl或ntohl这样的函数来转换您的d-word。

如果您真的想要反转32b数据类型中所有位的顺序,您可以编写一个迭代算法来屏蔽并将每个位移到适当的reflection位置。

对于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; } 

要反转整数的位顺序,可以在一个方向上移出位,并将位移到相反方向的目标位置。