大小端解释判断,网络字节序转换

转自:http://blog.csdn.net/peixuan197/article/details/48316389?locationNum=1
转自:http://blog.sina.com.cn/s/blog_6afeac5001010htc.html
转自:http://www.blogjava.net/tinysun/archive/2009/12/31/307952.html

网络字节序是大端

小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。
大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。

地址偏移大端模式小端模式
0x0012(OP0)78(OP3)
0x0134(OP1)56(OP2)
0x0256(OP2)34(OP1)
0x0378(OP3)12(OP0)

判断大小端的代码:

#include <stdio.h>
union X {
    int i;
    char ch[4];
};

int main () {
    X x;
    x.i = 0x12345678;
    printf("要测试的字符是:0x12345678");
    if(0x78 == x.ch[0] && 0x56 == x.ch[1] && 0x34 == x.ch[2] && 0x12 == x.ch[3]) {
        printf("小端系统:");
        printf("%x,%x,%x,%x\n,x.ch[0],x.ch[1],x.ch[2],x.ch[3]);
    } else {
        printf("大端系统:");
        printf("%x,%x,%x,%x\n,x.ch[0],x.ch[1],x.ch[2],x.ch[3]);
    }
    return 0;
}

网络字节序转换:
相关函数:
* unsigned short int htons(unsigned short int hostshort):
主机字节顺序转换成网络字节顺序,对无符号短型进行操作4bytes
* unsigned long int htonl(unsigned long int hostlong):
主机字节顺序转换成网络字节顺序,对无符号长型进行操作8bytes
* unsigned short int ntohs(unsigned short int netshort):
网络字节顺序转换成主机字节顺序,对无符号短型进行操作4bytes
* unsigned long int ntohl(unsigned long int netlong):
网络字节顺序转换成主机字节顺序,对无符号长型进行操作8bytes

转换代码:

    #include <stdio.h>
    #include <netinet/in.h>
    int main()
    {
        int i_num = 0x12345678;
        printf("[0]:0x%x\n", *((char *)&i_num + 0));
        printf("[1]:0x%x\n", *((char *)&i_num + 1));
        printf("[2]:0x%x\n", *((char *)&i_num + 2));
        printf("[3]:0x%x\n", *((char *)&i_num + 3));

        i_num = htonl(i_num);
        printf("[0]:0x%x\n", *((char *)&i_num + 0));
        printf("[1]:0x%x\n", *((char *)&i_num + 1));
        printf("[2]:0x%x\n", *((char *)&i_num + 2));
        printf("[3]:0x%x\n", *((char *)&i_num + 3));

        return 0;
    } 

在80X86CPU平台上,执行该程序得到如下结果:

[0]:0x78 
[1]:0x56 
[2]:0x34 
[3]:0x12

[0]:0x12 
[1]:0x34 
[2]:0x56 
[3]:0x78
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值