字节序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节序相关的知识,希望对你有一定的参考价值。

字节序是说整型数字在内存地址中存储的顺序,分为大端字节序、小端字节序两种:

* 大端字节序: 最高有效位存储于最低地址位,最低有效位存储于高地址位,既存储顺序与所见顺序相同

* 小端字节序: 最高有效位存储于最高地址位,最低有效位存储于最低地址位


字节序的运用分为主机字节序和网络字节序:

* 主机字节序: 根据主机类型不同字节序也就不同,我们常用的x86类型的机器字节序为小端字节序

* 网络字节序: 固定为大端字节序


举个例子,如果我们需要存储一个整型数字,比如0x12345678分别在内存中的顺序如下:

技术分享图片


写了个小脚本在测试机测一下结果相同:

#include <stdio.h>
#include <arpa/inet.h>
int main(void)
{
        unsigned int a = 0x12345678;
        unsigned char *b = (unsigned char *)&a;
        printf("%0x %0x %0x %0x\n",b[0],b[1],b[2],b[3]);
        unsigned int c = htonl(a);  //htonl 是字节序转换函数,转为网络字节序
        b = (unsigned char *)&c;
        printf("%0x %0x %0x %0x\n",b[0],b[1],b[2],b[3]);
        return 0;
}

运行之后打印的结果为:

78 56 34 12

12 34 56 78

顺序和介绍的字节序顺序相同

以上是关于字节序的主要内容,如果未能解决你的问题,请参考以下文章

bingbingc(网络编程TCP UDP)

bingbingc(网络编程TCP UDP)

zlib 的“解压缩”是不是保留数据的原始字节序,还是进行字节序转换?

为啥位字节序是位域中的一个问题?

编写跨平台位级代码时,字长和字节序会相互作用吗?

Linux 字节序