先理解几个概念
1字节序
多个字节 之间排列的顺序
2字节高低位
例如16进制 0x12345678 占用了4个字节 那么1234就是高位 5678就是低位
3内存高低地址
数据存在在内存中时 需要先划分分出一个区域给数据保存
栈底 (高地址)
----------
buf[3]
buf[2]
buf[1]
buf[0]
----------
栈顶 (低地址)
那么数据存储就会有多种方式保存
最常用的就是 大端和小端
小端
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
大端
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
Big-Endian: 低地址存放高位,如下图:
栈底 (高地址)
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
栈顶 (低地址)
Little-Endian: 低地址存放低位,如下图:
栈底 (高地址)
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
---------------
栈顶 (低地址)
4在网络编程中的使用
网络传输一般采用大端序,也被称之为网络字节序,或网络序。
操作系统中会出现小端模式
那么为什么网络编程会是大端模式呢?
网络传输 过程中采用大端 会优先把 重要的信号信息发送给服务
5modbus tcp 大小端 在java网络编程中的说明
协议说明 modbus 读取设备线圈状态
起始位地址 根据说明 起始位地址占用了 两个字节 第一个是高位字节 第二个是低位字节说明发送的数据就是采用了大端模式 已netty的ByteBuf buf 写入数据那么就是 java默认是大端模式
buf.writeShort(13)
如果某些协议采用小端模式怎么写入呢
buf.writeShortLE(a);