我有一个特殊的无符号长整数(32 位),我需要逐位转换它的字节顺序 - 我的长整数表示几件东西都被一起平滑成一个二进制文件。
我该怎么做?
字节序是一个字级概念,其中字节要么先存储最高有效字节(大端),要么先存储最低有效字节(小端)。通过网络传输的数据通常是大端(所谓的网络字节顺序)。存储在机器内存中的数据可以按任意顺序排列,鉴于 Intel x86 架构的流行,小端序是最常见的。尽管大多数计算机体系结构都是大端,但 x86 是如此普遍,以至于您经常会在内存中看到小端数据。
无论如何,关键是字节顺序是一个非常具体的概念,仅适用于字节级别,而不适用于位级别。如果ntohs()
, ntohl()
, htons()
, 并且htonl()
不做你想做的事,那么你正在处理的不是字节序本身。
如果您需要反转 unsigned long 的各个位或执行其他类似的复杂操作,请发布有关您需要做什么的更多信息。
小心理解“字节顺序”的含义。它指的是数据中字节的顺序,而不是字节中的位。您可能只需要使用 htonl 或 ntohl 之类的函数来转换您的 d-word。
如果您真的想反转 32b 数据类型中所有位的顺序,您可以编写一个迭代算法来屏蔽每个位并将其移动到适当的反射位置。
unsigned long 值的简单字节顺序转换函数如下所示:
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;
}
要反转整数的位顺序,您可以在一个方向移出位并在相反方向将位移到目的地。