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

参数和数据结构的序列化

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

接口规范定义了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个条目的序列化映射如下所示:

图片


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python 视频硬字幕去除 内嵌字幕去除工具 vsr

项目简介 开源地址:https://github.com/YaoFANGUK/video-subtitle-remover Video-subtitle-remover (VSR) 是一款基于AI技术,将视频中的硬字幕去除的软件。 主要实现了以下功能: 无损分辨率将视频中的硬字幕去除,生成去除字幕后…

本地部署企业邮箱,让企业办公更安全高效

随着信息化时代的到来,企业邮箱几乎成了企业办公的标配,承载着企业业务往来和办公协同的重要职能。基于安全性、个性化需求、系统集成等方面的需要,许多企业选择本地部署企业邮箱,本地化部署不仅能有效保障企业信息安全的同时&…

Spring6学习笔记01

一、课程简介 Spring框架是一款极其优秀的轻量级开源框架,为了解决企业应用开发的复杂性而出现。Spring框架的用途不仅仅限于服务器端的开发,从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。Spring框架凭借其…

机器人制作开源方案 | 晾衣收纳一体机器人

一、作品简介 作者:仓天赐 黄云超 吴正乐 高骏 代思旭 单位:泰州学院 指导老师:宋向前 李杨作者:仓天赐 黄云超 吴正乐 高骏 代思旭 单位:泰州学院 指导老师:宋向前 李杨 与智能家居系统含义近似的…

【Axure高保真原型】树切换动态面板案例

今天和大家分享树切换动态面板的原型模板,点击树的箭头可以打开或者收起子节点,点击最后一级人物节点,可以切换右侧面板的状态到对应的页面,左侧的树是通过中继器制作的,使用简单,只需要按要求填写中继器表…

【广州华锐互动】智能楼宇3D数字化展示,实现对建筑物的实时监控和管理

随着科技的不断发展,人们对于生活品质的要求也在不断提高。在这个信息爆炸的时代,如何将复杂的数据以直观、生动的方式呈现给用户,已经成为了一个重要的课题。智能楼宇3D数字化展示作为一种新型的建筑科技,正逐渐成为行业的新宠&a…

【QML】Qt和QML获取操作系统类型

1. Qt获取系统类型 //方法 QSysInfo::productType()//举例&#xff1a; if(QSysInfo::productType() "windows") {qDebug() << "windows system"; }官方说明&#xff1a; [static] QString QSysInfo::productType() Returns the product name of …

IntelliJ Idea 撤回git已经push的操作

最初的样子 现在的样子 解决方案 第一步&#xff0c;commit到本地撤回&#xff1a; 打开提交历史记录&#xff0c;选中回退的版本右键&#xff0c;点击“Reset Current Branch to Here…”,然后选中“Mixed”&#xff0c;点击Reset后&#xff0c;之前commit的代码会在本地显…

黑豹程序员-架构师学习路线图-百科:Knife4j API接口文档管理

文章目录 由来&#xff1a;接口文档第一代&#xff1a;Swagger第二代&#xff1a;Knife4j界面 由来&#xff1a;接口文档 古老编程是一个语言前后端通吃&#xff0c;ASP、JSP、PHP都是如此。 但随着项目规模变大&#xff0c;项目团队也开始壮大&#xff0c;岗位职责开始细分&a…

【STM32】定时器

systick定时器&#xff1a; 【STM32】Systick定时器-CSDN博客 0.通用定时器框图 1.时钟源 2.控制器 3.输入捕获 计数器实际上是与比较寄存器的影子寄存器进行比较的。 4.输出比较 1.STM32的定时器学习要点 参考手册 STM32F1xx中文参考手册.pdf 林何/STM32F103C8 - 码云 -…

Leetcode-394 字符串解码(不会,复习)

此题不会&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 题解思路&#xff1a;元组思想&#xff1a;数字[字符串]&#xff0c;每次遇到中括号意味着要重复数字次字符串…

Web APIs——综合案例

1、学生就业统计表 2、渲染业务 根据持久化数据渲染页面 步骤&#xff1a; ①&#xff1a;读取localstorage本地数据 如果有数据则转换为对象放到变量里面一会使用它渲染页面如果没有则用默认空数组[]为了测试效果&#xff0c;可以先把initData存入本地存储看效果 ②&…

Oracle11g for centos7

准备工作 x86 centos7 oracle11G 环境搭建 配置好虚拟机&#xff0c;网络通畅&#xff0c;建议最少3G内存。 安装依赖 yum install binutils compat-libstdc-33 glibc* ksh gcc gcc-c libgcc libstdc* libaio libaio-devel libXext libX11 libXau libxcb libXi make sy…

2023第六届泰迪杯数据分析,第五届泰迪杯数据分析技能赛B题源码图片分享

需要B题源码以及第六届带队”指导“请私信本人&#xff0c;团队包含技能赛双一等&#xff0c;数学建模省一&#xff0c;泰迪杯挖掘国一&#xff0c;研究生队友。 去年一等作品可视化图如下&#xff0c;私信获取源码

static关键字的三种用法

在C语言中&#xff0c;关键字"static"可以用于不同的上下文&#xff0c;具有不同的作用。以下是"static"在C语言中的主要作用&#xff1a; 1. 静态变量&#xff08;Static Variables&#xff09;&#xff1a; 在C语言中&#xff0c;使用static关键字来声明…

Java算法(五):手写数组逆置API方法,实现数组逆置。 while实现 for循环实现

Java算法&#xff08;五&#xff09; while 循环实现 需求&#xff1a; 已知一个数组&#xff0c;arr {11, 22, 33, 44, 55};使用程序实现把数组中的元素交换位置。 交换后的数组为 arr {55, 44, 33, 22, 11}; 并在控制台输出交换后的数组元素。 代码示例 package com.…

JS 处理文档选择和范围创建【createRange | getSelection】

介绍 1、const selection window.getSelection(); 说明&#xff1a; 1、用于获取用户当前文档选择的对象&#xff1b; 2、它返回一个 Selection 对象&#xff0c;该对象代表了用户选择的文本范围&#xff08;可以包含一个或多个范围&#xff0c;因为用户可以同时选择多个不相…

YOLO目标检测——红绿灯检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;红绿灯检测数据集在自动驾驶、交通安全监控、智能交通系统、交通流量监测和驾驶员辅助系统等领域都有广泛应用的潜力数据集说明&#xff1a;红绿灯检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含有国内红绿灯…

Android:OkHttp同步请求和异步请求

一、前言 网络请求之前工作中用到的是post请求&#xff0c;然后了解之后发现请求的种类还有很多种。下面着重讲到是get和post的同步请求和异步请求。 二、具体内容 1.Okhttp的特点&#xff1a; 支持Http/2并允许对同一主机的所有请求共享一套接字&#xff1b;如果非HTTP/2&…

运维相关(一) - Vue项目配置WebSocket连接{ws、wss 连接方式}

Vue项目配置WebSocket连接 ws、wss 两种方式 1. 写作背景2. 晒出代码2.1 前端 vue.config.js 的代码2.2 Vue项目路由配置代码3.3 服务器Nginx配置 3. 使用方式3.1 前端代码3.2 后端代码 4. 测试使用 1. 写作背景 项目使用的是ruoyi的前后端分离框架项目需要使用到 websocket , …