【网络编程】大端模式和小端模式(大头序和小头序)

大端:多字节值的大端存储在该值的起始位置;(老大站排头为大)

小端:多字节值的小端存储在该值的起始位置;(老小站排头为小)

例如16bit整数:0x0102,其中01即为多字节值的大端,02即为多字节值的小端。

在网络中传输的都是大端序,但具体到某台主机CPU的实现,则有可能是大端序也可能是小端序。一般X86是小端。

那么,如何通过程序来判断当前主机到底是大端还是小端呢?

/*判断大端还是小端, 1:小端  0:大端*/
int GetEndian()
{
    union
    {
        int a;
        char b;
    } s;
    s.a = 0x0001;
    return (1 == s.b);
}

联合体union的存放顺序是所有成员都从低地址开始存放,给s.a赋值为0x01,00为a的高端,01为a的低端,如果b==1,即a的低端位于起始位置,即小端,反之为大端。

 

我觉得《UNIX网络编程》(第一卷)给的例子更严密一些:

/*判断大端还是小端, 1:小端  0:大端*/
int GetEndian()
{
    union
    {
        short s;
        char c[sizeof(short)];
    }un;

    un.s = 0x0102;

    if(2 == sizeof(short))
    {
        if(1 == un.c[0] && 2 == un.c[1])
        {
            printf("big-endian\n");
            return 0;
        }
        else if(2 == un.c[0] && 1 == un.c[1])
        {
            printf("little-endian\n");
            return 1;
        }
        else
        {
            printf("unknown\n");
        }
    }
    else
    {
        printf("sizeof(short) = %d\n", sizeof(short));
    }

    return 0;
}

2011-12-14  任洪彩 qdurenhongcai@163.com

转载于:https://my.oschina.net/renhc/blog/37130

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值