序
- 本篇系对以太网SOME/IP协议的参数数据结构的序列化/反序列化的解读。
概述:SOME/IP 参数和数据结构的序列化
大小端/字节序
-
每个参数(parameter)的字节顺序由接口定义进行规定。
-
所有的 SOME/IP Header 字段,应该以网络字节序(大端)编码。
PRS_SOME/IP_00368
- Payload中参数的字节顺序由配置决定。
PRS_SPME/IP_00026
参数和数据结构的序列化
- 序列化(
Serialization)是指将数据结构或对象状态转换为二进制串(字节数组)的过程。
SOME/IP协议在传输过程中也自然需要进行序列化和反序列化。
- SOME/IP需要基于通信接口规范定义的参数列表进行序列化。
接口规范明确了
PDU(协议数据单元)中所有数据结构的精确位置,并且在设计时必须考虑存储器对齐的问题。
- 对齐操作通过在数据项之后添加填充元素来【调整数据的起始位置】,以确保数据从特定的、对齐的内存地址开始。
这是因为在某些处理器架构中,当数据从某个数的倍数(例如32位的倍数)地址开始时,数据访问会更加高效。
- 如果可变大小数据不是序列化数据流中的最后一个元素,则:应该通过在可变大小数据后面插入填充元素来实现数据的对齐。
PRS_SOMEIP_00611 / RS_SOMEIP_00028 , RS_SOMEIP_00029
- 请注意,Padding 值未被定义。
![[车载以太网] SOME/IP 参数和数据结构的序列化](http://www.itfaba.com/wp-content/themes/kemi/images/loading.gif)
Member2: 以 UInt8 元素组成的一维可变长数组 / Member5: 以 UInt8 元素组成的一维可变长数组
![[车载以太网] SOME/IP 参数和数据结构的序列化](http://www.itfaba.com/wp-content/themes/kemi/images/loading.gif)
Member2: 以 UInt8 元素组成的一维可变长数组 / Member5: 以 UInt8 元素组成的一维可变长数组
-
对齐应该能总是被计算出,从 SOME/IP 报文的起始处。
-
固定长度数据元素后面不得有填充元素,以确保后面数据的对齐。
如果定长数据元素后面的数据被填充,则这必须被显式地考虑进数据类型定义中。
- 可变长度数据元素后面的数据对齐应为8、16、32、64、128或256位。
RS_SOMEIP_000028 / RS_SOMEIP_000029
基本数据类型
- 应支持以下基本数据类型:
| Type | Description | Size [bit] | Remark |
|---|---|---|---|
| boolean | TRUE/FALSE value | 8 | FALSE (0), TRUE (1) |
| uint8 | unsigned Integer | 8 | |
| uint16 | unsigned Integer | 16 | |
| uint32 | unsigned Integer | 32 | |
| sint8 | signed Integer | 8 | |
| sint16 | signed Integer | 16 | |
| sint32 | signed Integer | 32 | |
| float32 | floating point number | 32 | IEEE 754 binary32 (Single Precision) |
| float64 | floating point number | 64 | IEEE 754 binary64 (Double Precision) |
- 每个参数的字节顺序由接口定义进行规定。
结构化数据类型 (结构体)
- 结构体的序列化应尽可能接近内存布局。
这意味着参数应按顺序序列化到缓冲区中。
对于结构体来说,特别要考虑正确的内存对齐。
如果需要对齐,请在接口定义中插入保留/填充元素,因为SOME/IP实现不会自动添加此类填充。
![[车载以太网] SOME/IP 参数和数据结构的序列化](http://www.itfaba.com/wp-content/themes/kemi/images/loading.gif)
-
SOME/IP实现不应自动插入虚拟/填充元素。
-
如果SOME/IP实现遇到导致
PDU未正确对齐的接口规范(例如,由于未对齐的结构体),SOME/IP实现应在发现不对齐的结构体时发出警告,但不应在生成代码时失败。 -
结构体的序列化应按照规范精确地进行。
-
可以在结构体前面添加一个8位、16位或32位的【可选】的【长度字段】,其取决于接口规范的配置。
如果未指定长度字段的长度,则必须假定长度为0,并且消息中没有长度字段。
- 结构体的长度字段描述了结构体的字节数。
如果长度大于接口定义中指定的结构体长度,则只有接口规范中指定的字节将被解释,其他字节将根据长度字段被跳过。
这样可以实现可扩展的结构体,从而更好地实现接口的迁移。
-
如果长度效于所有结构体成员的长度之和,且接收者无法在本地提供缺失数据的替换时,则 反序列化应被中止,且该报文应被视为是畸形的。
-
结构体的序列化应遵循结构化的数据类型的【深度优先遍历】。
字符串
如下需求是定长字符串和动态长度字符串的共同点。
- [PRS_SOMEIP_00372] 不同的Unicode字符集编码应被支持,包括: UTF-8 / UTF-16BE / UTF-16LE
PRS_SOMEIP_00372 / RS_SOMEIP_00038
- [PRS_SOMEIP_00948] UTF-8 字符串应以