SOME/IP 协议介绍(三)参数和数据结构的序列化

news2024/11/27 8:41:56

参数和数据结构的序列化

序列化是基于接口规范定义的参数列表。为了允许服务接口的迁移,反序列化,代码应忽略附加在先前已知的参数列表末尾的参数;也就是说,忽略在用于生成或参数化反序列化代码的接口规范中未定义的参数。

接口规范定义了PDU中所有参数的确切位置,并考虑了内存对齐。序列化过程不应尝试自动对齐参数,而应按照接口规范中指定的对齐方式进行对齐。SOME/IP负载应该在内存中放置,以使SOME/IP负载能够适当地对齐。对于车载娱乐设备的ECU,应该实现8字节(即64位)的对齐,对于所有ECU,至少应实现4字节的对齐。
接下来将指定不同参数的反序列化过程。

基本数据类型

应支持以下基本数据类型:

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实现遇到导致PDU未正确对齐的接口规范(例如,由于未对齐的结构体),SOME/IP实现应在发现不对齐的结构体时发出警告,但不应在生成代码时失败。
结构体的序列化应按照规范精确地进行。
SOME/IP实现不应自动插入虚拟/填充元素。

图片

接口规范可以在结构体前面添加一个8位、16位或32位的长度字段。如果未指定长度字段的长度,则必须假定长度为0,并且消息中没有长度字段。

结构体的长度字段描述了结构体的字节数。如果长度大于接口定义中指定的结构体长度,则只有接口规范中指定的字节将被解释,其他字节将根据长度字段被跳过。这样可以实现可扩展的结构体,从而更好地实现接口的迁移。

字符串(定长)

字符串使用Unicode进行编码,并以“\0”字符结尾。在接口定义中必须指定字符串的字节长度(包括“\0”)。使用“\0”填充未使用的空间。
应支持不同的Unicode编码,包括UTF-8、UTF-16BE和UTF-16LE。由于这些编码每个字符的字节长度是动态的,字节的最大长度是UTF-8中字符长度的三倍加上1个字节的“\0”终止符,或者UTF-16中字符长度的两倍加上2个字节的“\0”终止符。
字符串的编码方式应在接口定义中指定。

字符串(动态长度)

动态长度的字符串以长度字段开头。长度以字节为单位,并跟随以“\0”结尾的字符串数据。接口定义还应定义字符串(包括以“\0”结尾)可以占用的最大字节数。
长度字段的长度可以是8位、16位或32位。固定长度的字符串可以视为长度字段为0位。
如果接口规范没有另外指定,长度字段的长度为32位(长度字段的默认长度)。
字符串长度字段的值不考虑在长度字段本身的值中;也就是说,长度字段不计入自身的长度。
支持的编码方式如[SIP_RPC_232第19页]中所定义。
如果接口定义提示下一个数据元素的对齐方式,字符串应通过添加“\0”字符来扩展以满足对齐要求。

数组(固定长度)

固定长度数组的长度由接口定义确定。它们可以被视为重复的元素。在[SIP_RPC_253 页错误!未定义书签。]中展示了动态长度数组,也可以使用。然而,固定长度数组可以更容易地集成到早期版本的AUTOSAR和非常小的设备中;因此,两种选项都得到支持。

一维数组

固定长度为n的一维数组包含恰好n个相同类型的元素。布局如图2所示。

图片

多维数组

多维数组的序列化遵循C++编程语言中多维数组的内存布局(按行主序),如图3所示

图片

可选字段

可选字段应被编码为包含0到1个元素的数组。对于具有动态长度的数组的序列化,请参阅[SIP_RPC_253]。
动态长度数组
具有动态长度的数组的布局基本上基于固定长度数组的布局。为了确定数组的大小,序列化在数据前面添加一个长度字段(默认长度为32位),该字段计算数组的字节数。长度不包括长度字段的大小。因此,在传输零元素的数组时,长度设置为零。
接口定义可以定义长度字段的长度。允许长度为0、8、16和32位。如果将长度设置为0位,则数组中的元素数量必须是固定的;因此,它是具有固定长度的数组。

动态数组的布局如图4和图5所示。

图片

在一维数组中,使用一个长度字段,该字段表示数组使用的字节数。可以通过将字节数除以元素的大小来轻松计算元素的数量。

图片

在多维数组中,需要多个长度字段。接口定义应定义每个维度的最大长度,以便允许进行静态缓冲区大小的分配。在以字节为单位测量长度时,可以在反序列化过程中跳过复杂的多维数组。

枚举

接口定义可以基于无符号整数数据类型(uint8、uint16、uint32、uint64)指定枚举类型。

位域

位域应作为基本数据类型uint8/uint16/uint32进行传输。接口定义应能够定义每个位的名称。接口定义应能够定义位可以设置为的值的名称。
每个SOME/IP实现可以选择对位域进行解/序列化,或者将uint8/uint16/uint32传递给应用程序。SOME/IP实现可以允许开启或关闭位域的解/序列化。

联合(变体)

联合(也称为变体)是一种可以包含不同类型元素的参数。例如,如果定义了一个uint8类型和uint16类型的联合,该联合将携带一个uint8或uint16类型的元素。显然,当使用不同类型的元素时,后续参数的对齐可能会被扭曲。为了解决这个问题,可能需要填充。
默认情况下,SOME/IP中联合的序列化布局如下:

图片


长度字段和类型字段的顺序可以通过接口规范进行调整。如果未指定,则使用[TR_SOMEIP_00119]中的默认布局。

长度字段的长度应由接口规范定义,并且可以是32位、16位、8位或0位。长度字段为0位表示不会将长度字段写入PDU。如果长度字段为0位,则联合中的所有类型的长度必须相同。

如果接口规范定义了一个长度字段为0位的联合,并且具有不同长度的类型,则SOME/IP实现应该发出警告,并使用最长元素的长度,并用零(0x00)填充其他元素。
如果接口规范未指定联合的长度字段的长度,则应使用32位长度的长度字段。
长度字段以字节为单位定义元素和填充的大小,不包括长度字段和类型字段的大小。

类型字段的长度应由接口规范定义,并且可以是32位、16位或8位。
如果接口规范未指定联合的类型字段的长度,则应使用32位长度的类型字段。
类型字段描述元素的类型。类型字段的可能值由接口规范为每个联合单独定义。类型按照接口规范中的编码以升序排列,从1开始。0保留为NULL类型,即空联合。接口定义应允许使用NULL。

根据类型字段中的类型,元素将进行序列化。结合长度字段,可以在元素后面添加填充。反序列化器应根据长度字段跳过字节。每种类型的长度字段的值应由接口规范定义。通过使用结构体,可以实现不同的填充布局。

示例:uint8/uint16联合,均填充为32位

在此示例中,长度字段的长度指定为32位。该联合应支持uint8和uint16作为元素。两者都填充到32位边界(长度为4)。uint8的序列化如下所示:

图片

uint16的序列化如下所示:

图片

将映射或字典描述为键值对数组是最基本的方式。实现映射或字典的最基本方法是使用一个具有两个字段(键和值)的结构体数组。由于结构体没有长度字段,这种方式与特殊的映射或字典类型一样高效。如果选择uint16作为键和值,一个包含3个条目的序列化映射如下所示:

图片


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1188418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java动态设置注解值

描述:在运行时根据需求更改注解中的值 一、步骤 1.定义类 public class CadreListQueryDTO extends CadreBaseQueryDTO {/*** 出国事由*/QueryField(field "A21.a2114",type QueryField.LIKE)private String a2114; }2.定义方法进行动态设置 /*** 动…

Maven 从入门到精通

目录 一. 前言 二. Maven 下载与安装 2.1. 下载 2.2. 安装 三. Maven 核心概念 3.1. POM 3.2. 约定的目录结构 3.3. 坐标 3.4. 依赖管理 3.4.1. 直接依赖和间接依赖 3.4.2. 依赖的排除 3.4.3. 统一的版本管理 3.4.4. 依赖范围 3.5. 仓库 3.6. 生命周期/插件/目标…

去中心化数据云项目Oort主网即将上线

备受期待的去中心化数据云项目Oort,今日已通过官方X账号官宣,将于纽约时间11月27日正式上线主网Olympus Protocol。届时,用户也能够通过Oort的Ale Wallet钱包和开发者API使用主网,并可通过OORT浏览器查询交易和合约,开…

OpenAI开源全新解码器,极大提升Stable Diffusion性能

在11月7日OpenAI的首届开发者大会上,除了推出一系列重磅产品之外,还开源了两款产品,全新解码器Consistency Decoder(一致性解码器)和最新语音识别模型Whisper v3。 据悉,Consistency Decoder可以替代Stabl…

如何实现Debian工控电脑USB接口安全管控

Debian 作为工控电脑操作系统具有稳定性、安全性、自定义性和丰富的软件包等优势,适用于要求高度可靠性和安全性的工控应用。 Debian 作为工控电脑操作系统在工业控制领域有很大优势,包括: 稳定性:Debian 的发布版以其稳定性而闻…

等保评测是什么意思

等保评测是一种信息安全评估标准,是国家信息安全管理机构为确保信息安全而对信息系统的安全性能进行定期评估的行为。它主要用于评估网络安全的实现情况,包括组织和技术。 等保评测具有系统性和综合性,能够及时发现网络安全风险,…

云闪付app拉新 地推和网推百搭项目 升级涨价啦 附一手渠道

云闪付为银联的支付产品,在地推网推拉新项目市场里也是比较稳定的项目 可以通过”聚量推客“ 渠道申请推广 今天平台拿到了更好的政策价格 价格再次上涨,地推和网推的小伙伴们可以申请推广哦,百搭项目

基于范数求解缩放因子方法的MIMO系统预编码技术matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1. MIMO系统模型 4.2. 基于范数求解缩放因子的预编码技术 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 。。。。。。。。。。。。。。。…

使用Docker部署开源分布式任务调度系统DolphinScheduler

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 使用Docker部署开源分布式任务调度系统DolphinScheduler 文章目录 使用Docker部署开源分布式任务…

计数排序【java实现】

一、计数排序 排序特点: 输入元素大于等于零,当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 O(n k)。计 数排序不是比较排 序,排序的速度快于任何比较排序算法。适合数据范围小的数组。 核心思想: 找出…

Java单元测试及常用语句

1、前言 编写Java单元测试用例,即把一段复杂的代码拆解成一系列简单的单元测试用例,并且无需启动服务,在短时间内测试代码中的处理逻辑。写好Java单元测试用例,其实就是把“复杂问题简单化,建单问题深入化“。在编写的…

Python - 利用 OCR 技术提取视频台词、字幕

目录 一.引言 二.视频处理 1.视频样式 2.视频截取 ◆ 裁切降帧 ◆ 处理效果 3.视频分段 三.OCR 处理 1.视频帧处理 2.文本识别结果 3.后续工作与优化 ◆ 识别去重 ◆ 多线程提效 ◆ 片头片尾优化 四.总结 一.引言 视频经常会配套对应的台词或者字幕&#xff0c…

11.斐波那契数列【兔子生崽】

文章目录 前言一、题目描述 二、解题 前言 本系列为循环结构编程题,点滴成长,一起逆袭。 一、题目描述 二、解题 古典问题(兔子生崽)

k8s存储卷 PV和PVC

目录 emptyDir存储卷 hostPath存储卷 nfs共享存储卷 PVC 和 PV 生命周期 一个PV从创建到销毁的具体流程如下: 静态pvc 动态pvc 3、定义PVC 4、测试访问 搭建 StorageClass NFS,实现 NFS 的动态 PV 创建 1、在stor01节点上安装nfs&#xff0…

Flutter学习:使用CustomPaint绘制路径

Flutter学习:认识CustomPaint组件和Paint对象 Flutter学习:使用CustomPaint绘制路径 Flutter学习:使用CustomPaint绘制图形 Flutter学习:使用CustomPaint绘制文字 Flutter学习:使用CustomPaint绘制图片 drawPath 绘制路…

IDC发布2023H1CRM报告 ,纷享销客增长率稳居第一

近期,国际数据公司(IDC)发布了《IDC China Semiannual CRM SaaS Tracker 2023H1》数据报告,该报告详细分析了纷享销客和Salesforce等国内外CRM厂商的数据。根据报告数据显示,纷享销客2023年H1的增长速度依然保持近40%&…

使用easyui前端框架快速构建一个crud应用

本篇文章将会详细介绍jquery easyui前端框架的使用,通过创建一个crud应用来带大家快速掌握easyui的使用。 easyui是博主最喜欢的前端框架,没有之一,因为它提供了多种主题,而且圆润可爱的组件吸引了我。 快速开始 easyui的官网地址…

相交链表~

题目描述 给你两个单链表的头节点 headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null。图示两个链表在节点 c1 开始相交: 题目数据保证整个链式结构中不存在环。注意,函数返回结果后&…

文本标注工具doccano 中上传dataset无法成功

问题描述 文本标注工具doccano 中上传dataset无法成功,一直处于加载界面 解决方法 没有执行这个方法 doccano task

CorelDRAW2023绿色版免安装

我们都知道最新的画笔库和画笔搜索:CorelDRAW 2023中新增了最新的画笔库和画笔搜索功能,使用者能够轻松查找和应用各种画笔和笔刷。根据软件大数据显示 CorelDRAW? Graphics Suite 专为提高您的工作效率而设计,受到全球数百万图形专业人员和…