C Endian转换:逐位转换

时间:2009-10-23 15:57:06

标签: c binary endianness

我有一个特殊的无符号长整数(32位),我需要一点一点地转换它的字节顺序 - 我的long代表几个所有的东西一起被整合成一个二进制文件。

我该怎么做?

4 个答案:

答案 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)

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