大小端说明
- 大端模式就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端
- 小端模式就是高位字节排放在内存的高地址端,低位字节排放在内存的低地址端
举例 如要存储 0x11223344 到 modbus寄存器的地址4x4000 4x4001 中
其中0x11223344中有四个字节 分别是 0X11 0X22 0X33 0X44 其中0X11为最高位字节,0X44为最低位字节
寄存器地址4x4000为低地址端 4x4001为高地址端
寄存器地址 | 4000(高字节位) | 4000(低字节位) | 4001(高字节位) | 4001(低字节位) |
---|---|---|---|---|
小端值 | 0x44 | 0x33 | 0x22 | 0x11 |
大端值 | 0x11 | 0x22 | 0x33 | 0x44 |
小端值(交换字节) | 0x33 | 0x44 | 0x11 | 0x22 |
大端值(交换字节) | 0x22 | 0x11 | 0x44 | 0x33 |
寄存器字节序数值举例
一个字节(unsigned char)是8位
一个字是两个字节
一个modbus寄存器存一个字,也就是两个字节,十六位
字节交换就是把一个寄存器里的两个字节进行交换
类型 | 值 | 格式 | 描述 |
---|---|---|---|
float | 5.23 | – | 浮点型 |
unsigned ch(HEX) | 29 5C A7 40 | A B C D | 浮点型对应无符号char型数据(说明计算机是小端格式) |
big-entian HEX | 40 A7 5C 29 | D C B A | 大端格式 |
little-entian HEX | 29 5C A7 40 | A B C D | 小端格式 |
big-entian byte swap | A7 40 29 5C | C D A B | 大端格式 字节交换 |
little-entian byte swap | 5C 29 40 A7 | B A D C | 小端格式 字节交换 |
附:
联合体HEX --> float
union {
float f;
char ch[sizeof(float)];
}value;
//小端格式的5.23
unsigned char hex[4] = {0x29,0x5C,0xA7,0x40};
value.ch[0] = hex[0];
value.ch[1] = hex[1];
value.ch[2] = hex[2];
value.ch[3] = hex[3];
printf("0 1 2 3 %lf\n",value.f);