通俗易懂说字节序,大小端,网络序和主机序

通俗易懂说字节序,大小端,网络序和主机序通俗易懂说网络序和主机序 1 什么是字节序 2 什么是网络字节序 3 什么是主机字节序 3 1 主机字节序 3 2 大小端字节序 4 举例 1 什么是字节序 字节序 顾名思义字节的顺序 就是大于一个字节类型的数据在内存中的存放顺序 一个字节的数据没有顺序的问题了 如 char 类型数据占 1 字节 int 占 4 字节 故 int 类型数据在传输过程中就需要考虑字节序的问题 2 什么是网络字

1. 什么是字节序

1.1 为什么字符串不用转序

例子:

char acName[32]; memset(acName, 0, sizeof(acName)); strlcpy(acName, "hani", sizeof(acName)); 不用转序传输到网络…… 接收…… 

因为:

字符串中的每个字符如'h','a','n'等都是占一个字节。 就没有字节序的问题了。 而 int a = 4; //a占4个字节就涉及字节序了。 

2. 什么是网络字节序

网络字节序:
TCP/IP各层协议将字节序定义为Big-Endian,
因此TCP/IP协议中使用的字节序通常称之为网络字节序。




 4个字节的32 bit值以下面的次序传输: 高字节--------------------------------------低字节 首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。 这种传输次序称作大端字节序。 

由于TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序

3. 什么是主机字节序

3.1 主机字节序

通常我们说的主机序(Host Order)就是遵循Little-Endian规则

就是我们平常说的大端和小端模式:不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。

3.2 大小端字节序

4. 举例

地址: 0x00 0x01 大端: 12 34 小端: 34 12 

4.1 主机序代码例子说明

//定义 typedef struct stTest{ …… UINT uiID;/*ID */ UINT uiLoadId; UINT uiWhoisSum; UINT uiFileWhoisSum; …… } //赋值 stTest pstItem; …… pstItem->uiID = XX_INVALID_INSTANCE_ID; //(0xffffffff) pstItem->uiLoadId = XX_FILELOAD_MAX; //3 pstItem->uiWhoisSum = 0; pstItem->uiFileWhoisSum = 2; //看内存 (gdb) x /32x &pstItem->uiID //内存地址升高b0 b1 b2 b3 b4 b5 b6 b7 0xfc62b0: 0xff 0xff 0xff 0xff 0x03 0x00 0x00 0x00 0xfc62b8: 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0xfc62c0: 0x32 0x32 0x32 0x33 0x00 0x00 0x00 0x00 0xfc62c8: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 (gdb) 

由此可以看出:uiLoadId 的值3,0x00 00 00 03低字节存放在低地址处,是小端序

5. 判断一个体系结构是 big-endian 还是 little-endian

5.1 简单方法:

//同上,看内存 //小端序设备 (gdb) x /32x &pstItem->uiID //内存地址升高b0 b1 b2 b3 b4 b5 b6 b7 0xfc62b0: 0xff 0xff 0xff 0xff 0x03 0x00 0x00 0x00 0xfc62b8: 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0xfc62c0: 0x32 0x32 0x32 0x33 0x00 0x00 0x00 0x00 0xfc62c8: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 (gdb) 

大端序:

//大端序设备 (gdb) x /32x &pstItem->uiID 0x12f70dfe0: 0xffffffff 0x00000003 0x00000000 0x00000000 0x12f70dff0: 0x 0x00000000 0x00000000 0x00000000 …… 

5.2 复杂方法:

int x = 1; /* 32位 二进制 00000000 00000000 00000000 00000001 */ /* * 内存地址方向: 高位 <--------------------> 低位 * little-endian 表示: 00000000 00000000 00000000 00000001 * big-endian 表示: 00000001 00000000 00000000 00000000 */ if (*(char *) &x == 1) /* 这里把int型转为char型, 相当于只取了int型的最低8bit */ /* little-endian */ else /* big-endian */ 

5.3 一般来说:arm和x86架构是小端序,mips架构是大端序

6. 源码实现

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223127.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午2:47
下一篇 2026年3月17日 下午2:48


相关推荐

  • Java interface 做函数参数

    Java interface 做函数参数在很多项目中会用到 java 的 interface 做参数的情况 用 interface 做参数有两个好处 1 使用 interface 做参数的函数可以接受不同的类对象 只要不同的类都实现了相同的 interface 2 编写函数的只考虑函数的实现逻辑 不用考虑传递进来的参数对应的内部实现 下面是一个例子 NodeListnl newTest1 UsingTest1

    2026年3月26日
    3
  • 安森美半导体强化汽车战略,倾力服务中国汽车市场

    安森美半导体强化汽车战略,倾力服务中国汽车市场从近年来的全球汽车市场发展来看 石油价格在不断影响消费者行为并成为了汽车创新的推动力 虽然欧洲债务危机影响了汽车市场需求 但美国汽车市场已经开始复苏 而自 2010 年开始 新兴国家占全球汽车市场份额已超过了 50 中国更已成为世界第一大汽车市场 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 在全球汽车市场发展过程中 像安森美半导体这样的高能效电子产品首要硅方案供应商对汽车领域积极发展 在动力系统 车身 信息娱乐 电源 车

    2026年3月16日
    2
  • 自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令

    自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令

    2022年1月28日
    41
  • .load()方法的注意事项[通俗易懂]

    .load()方法的注意事项

    2022年3月13日
    45
  • 手把手教你制作机房三维场景(3D效果图)

    手把手教你制作机房三维场景(3D效果图)前言:随着信息技术的不断发展,大量数据中心机房的建设、监控软件已经成为机房管理者的重要武器,特别是机房效果图这一块,从简易的CAD到现在的3D效果图,从静态到三维动态的改进,机房监控软件基本上可以说是从无到有的一个过程,下面本文跟大家分享机房高大上的数据中心三维可视化管理软件的三维场景制作过程(俗称:3D效果图的制作过程)。以前的机房效果图现在的机房3D效果图数据中心可三维可视化管理软件,通过对现

    2022年6月2日
    152
  • python编程100例_python进阶路线图

    python编程100例_python进阶路线图异常模块下面介绍python常用的异常模块AttributeError异常AttributeError试图访问一个类中不存在的成员(包括:成员变量、属性和成员方法)而引发的异常Attribut

    2022年7月28日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号