判断机器字节序

发布时间:2017-03-31 09:57:40
C/C++ 

正文

字节序分为大端字节序(big endian)和小端字节序(little endian)。大端字节序是指一个整数的高位字节(23-31bit)存储在内存的低地址处,低位字节(0-7bit)存储在内存的高地址处。小端字节序相反。

现代PC大多采用小端字节序,因此小端字节序又称为主机字节序

当格式化数据在两台使用不同字节序的主机间传递时,接收端必然错误的解释之。解决问题的办法是:发送端总是把要发送的数据转化为大端字节序后再发送。接收端接收到大端字节序的数据后,根据自身情况使用。因此大端字节序又称为网络字节序

#include <stdio.h>

void byteorder()
{
    union{
        short value;
        char union_bytes[sizeof(short)];
    }test;
    test.value = 0x0102;
    if((test.union_bytes[0]==1)&&(test.union_bytes[1]==2)){
        printf("big endian\n");
    }
    else if((test.union_bytes[0]==2) && (test.union_bytes[1]==1)){
        printf("little endian\n");
    }
    else{
        printf("unknown...\n");
    }
}


void main()
{
    byteorder();
}

一点实验

#include <stdio.h>

void main()
{
    union{
        short value;
        char union_bytes[sizeof(short)];
    }test1;
    union{
        int value;
        char union_bytes[sizeof(short)];
    }test2;
    test1.value = 0x0102;
    test2.value = 0x01020304;
    int i;
    for(i=0;i<sizeof(short);i++){
        printf("%d ",test1.union_bytes[i]);
    }
    printf("\n");
    for(i=0;i<sizeof(int);i++){
        printf("%d ",test2.union_bytes[i]);
    }
    printf("\n");
}

输出

2 1 
4 3 2 1

说明我的机器是小端字节序

备注

linux提供4个函数来完成主机字节序和网络字节序之间的转换:

#include <netinet/in.h>
unsigned long int htonl(unsigned long int hostlong);//host to network long, long型的主机字节序转网络字节序
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);

长整型函数通常用来转换IP地址,短整型函数用来转换端口号。(当然不限于此,任何格式化的数据通过网络传输时,都应该使用这些函数来转换字节序)

参考

  • Linux高性能服务器编程,游双
原文地址:http://zhyoulun.com/post/judge-little-endian-or-big-endian
转载请注明出处