[通讯] 大端和小端的问题(Big endian and Little endian)
数据类型说明
数据类型是编程语言中非常重要的概念,其作用主要有以下几个方面:
- 内存分配:不同的数据类型在内存中需要分配不同的空间。例如,整数通常需要占用 4 个字节的内存空间,而浮点数可能需要 8 个字节或更多的空间。因此,正确的数据类型可以确保内存使用效率和程序性能。
- 数据处理:不同的数据类型可以支持不同的操作和运算。例如,整数可以进行加减乘除等算术运算,而字符串可以进行连接、分割等操作。正确的数据类型可以确保数据处理的正确性和有效性。
- 输入输出:不同的数据类型需要不同的输入输出方式。例如,整数可以通过标准输入输出进行读写,正确的数据类型可以确保程序能够正确地读写数据。
- 代码逻辑:不同的数据类型对应不同的含义和用途,因此在编写代码时需要选择正确的数据类型来反映代码逻辑和意图。例如,布尔型变量通常用于控制流程和逻辑判断,而整数和浮点数通常用于数学计算。
综上所述,正确选择和使用数据类型是编程中至关重要的一步,它直接关系到程序的正确性、性能和可维护性。
Tip:
编写程序需要理解数据的本质。例如,int 数据类型下的数字 1065353216 的数据本质是“00 00 80 3F”,而 float 数据类型下的数字 1 的数据本质也是“00 00 80 3F”。然而,当面对数据“00 00 80 3F”时,我们无法确定其代表什么含义。可能会认为 1065353216 太大,显然不对,必然是 float 类型的 1。但这是主观的人为判断,程序并不知道。因此,在解析数据时,必须使用正确的数据类型进行解析,否则会产生乱码。换言之,对于数据来说,应当使用与其原本类型相同的类型进行解析。
#关于数据排列问题
上述的数据表格里有例子,int 数据 100 的本质是 "64 00 00 00",而从我们的人的感官来说,应该是 "00 00 00 64" 比较合理。大部分人的习惯是高位在前,低位在后。但这只是一种规定,数据存储可以有多种排列,大体上分为三种:
- 小端排列:典型的代表是 C# 语言,三菱 PLC。
- 大端排列:典型的代表是西门子 PLC。
- 其他不规则:典型的代表是 modbus 设备。
多种字节顺序,如下表所示:
#ENDIAN
字节顺序,适用于 int16/uint16/int32/uint32/float 数据类型,详细说明见下表。
符号 | 字节顺序 | 支持的数据类型 | 备注 |
---|---|---|---|
#B | 2,1 | int16/uint16 | |
#L | 1,2 | int16/uint16 | 默认字节顺序 |
#LL | 1,2,3,4 | int32/uint32/float | 默认字节顺序 |
#LB | 2,1,4,3 | int32/uint32/float | |
#BB | 3,4,1,2 | int32/uint32/float | |
#BL | 4,3,2,1 | int32/uint32/float |
#.LEN[H][L][D][E]
当数据类型为 STRING 类型时,.LEN 是必填项,表示字符串需要占用的字节长度,每个寄存器中包含H,L,D 和E 四种存储方式,如下列表格所示。
符号 | 说明 |
---|---|
H | 一个寄存器存储两个字节,高字节在前低字节在后。 |
L | 一个寄存器存储两个字节,低字节在前高字节在后。 |
D | 一个寄存器存储一个字节,且存储在低字节。 |
E | 一个寄存器存储一个字节,且存储在高字节。 |