字节顺序

字节顺序是一个字中一个字中各个字节的顺序。字节序有两种,内存存储时分为把低序字节(也就是最右边的字节)存储在内存的起始位置,称为小端字节序(little-endian),反之,为大端字节序。Linux同时支持这两种类型的机器,为了在网络上统一,网络字节序是都是高位字节序,对比网络字节序和主机字节序,我的经验是遇到的机器都是小端字节序,ethreal上看到的都是转化成主机字节序的,以下程序可以本地机器的主机字节序测试。

#include <stdio.h>
int main()
{
        union{
                long s;
                char c[sizeof(long)];
        }un;
        un.s=0x00001f44;
        if ( un.c[0]==0x44 )
              printf("little-endian/n");
        else
              printf("big-endian/n");

今天在《linux内核设计与实现》中看到了一个更简洁的做法

#include <stdio.h>

int main()

{

        int i=1;

        if ( *(unsigned char *)&i == 1 )

                 printf("little-endian/n");

        else

                 printf("big-endian/n");

}

 

在include/linux/byteorder中包含了一组宏命令用于完成字节顺序之间的相互转换。最常用的宏命令:

u32 __cpu_to_be32(u32);   /* 将cpu字节顺转换成大端字节序 */

u32 __cpu_to_le32(u32);

u32 __be32_to_cpu(u32);

u32 __le32_to_cpus(u32);

你可能感兴趣的:(c,linux,网络,测试,存储,linux内核)