SOME/IP 协议详解——序列化

文章目录

  • 0. 概述
  • 1.基本数据序列化
  • 2.字符串序列化
    • 2.1 字符串通用规则
    • 2.2 固定长度字符串规则
    • 2.3 动态长度字符串规则
  • 3.结构体序列化
  • 4. 带有标识符和可选成员的结构化数据类型
  • 5. 数组
    • 5.1 固定长度数组
    • 5.2 动态长度数组
    • 5.3 Enumeration(枚举)
    • 5.4 Bitfield(位域)
    • 5.5 Union/Variant(联合 / 变体)
  • 总结

0. 概述

SOME/IP序列化分为四部分,基本数据序列化,字符串序列化,结构体序列化,数组序列化。

1.基本数据序列化

TypeDescriptionSize [bit]Remark
booleanTRUE/FALSE value8FALSE (0), TRUE (1)
uint8unsigned Integer8
uint16unsigned Integer16
uint32unsigned Integer32
sint8signed Integer8
sint16signed Integer16
sint32signed Integer32
float32floating point number32IEEE 754 binary32 (Single Precision)
float64floating point number64IEEE 754 binary64 (Double Precision)

对于每个参数的字节序,是由配置来决定的(大小端顺序)。这就好比是给一群数字 “小朋友” 排队,不同的配置会让他们站成不同的顺序。

在对布尔值进行评估时,只看 uint8 中的最低位,其他位都被忽略。

这些基本数据类型在 SOME/IP 协议中就像是一个个小积木,通过不同的组合和排列,构建起了复杂的数据结构,支撑着整个协议的数据处理和传输功能。

2.字符串序列化

2.1 字符串通用规则

  • 编码支持
    • 支持不同的 Unicode 编码,包括 UTF - 8、UTF - 16BE 和 UTF - 16LE。
  • 字符串终止
    • UTF - 16LE 和 UTF - 16BE 字符串应以零字符(‘\0’)终止,且至少有两个 0x00 字节。
    • 所有字符串应始终以字节顺序标记(BOM)开始,BOM 应包含在固定长度和动态长度字符串中,用于检测编码。

2.2 固定长度字符串规则

  • 字符串终止
    • 固定长度字符串也应以 ‘\0’ 字符终止,且字符串长度(包括 ‘\0’ 字节)在数据类型定义中指定,未使用空间用 ‘\0’ 填充,BOM 包含在长度内。
  • 长度检查
    • 如果固定长度字符串长于预期,反序列化应停止,消息视为格式错误。
    • 如果固定长度字符串短于预期但正确以 ‘\0’ 终止,可接受。
    • 如果固定长度字符串短于预期且未正确以 ‘\0’ 终止,反序列化应停止,消息视为格式错误。

2.3 动态长度字符串规则

  • 长度字段
    • 动态长度字符串应以长度字段开始,长度以字节为单位测量,长度字段在 BOM 之前,BOM 包含在长度内,字符串以 ‘\0’ 终止,字符串(包括 ‘\0’ 终止)的最大字节数由数据类型定义得出。
  • 长度定义
    • 动态长度字符串的长度字段有 8、16 或 32 位可选,由接口规范决定,未指定时默认 32 位。长度字段的值不包括长度字段本身。
    • 如果动态长度字符串长于预期,反序列化应停止,消息视为格式错误。
  • 替代传输方式
    • 除了将应用程序字符串作为带有 BOM 和 ‘\0’ 终止的 SOME/IP 字符串传输外,还可将其作为普通动态长度数组传输(不带 BOM 和 ‘\0’ 终止),但应用程序需自行处理字符串,如编码转换。

概括而言:
定长字符串格式【BOM】【data】【‘\0’】
变长字符串格式【length】【BOM】【data】【‘\0’】

lenth大小默认为4byte,包含BOM,data和结束符的长度总和。

3.结构体序列化

  • 总体原则
    • 结构体序列化要依循内存布局,像按图施工一样逐个参数序列化到缓冲区,且要考虑内存对齐。
  • 示例说明
    在这里插入图片描述
    以几个结构体及其内部成员(如 Struct_1 包含 uint32 a 和 float32 b [2] 等)展示序列化过程,如同按盒子内物品摆放顺序处理。
  • 关键规则
    • 填充数据:不会自动插入无用填充数据,保证数据紧凑。
    • 长度字段:可配置插入 8、16 或 32 位长度字段来标识结构体传输字节数,长度不包含长度字段自身。
    • 长度检查处理:接收长度大于定义时只按定义处理,多余跳过;长度小于且无法补全缺失数据时反序列化中止,视为格式错误。
    • 序列化顺序:按深度优先遍历顺序进行序列化,确保成员处理无遗漏或重复。

4. 带有标识符和可选成员的结构化数据类型

  • 总体目的

    • 为了实现更好的前向和后向兼容性,在结构体成员或方法参数前可添加额外的数据标识符(Data ID)。接收方可以通过这些标识符跳过未知成员或参数,保证系统在处理新旧数据时的兼容性。
  • 标识符规则

    • 唯一性:数据标识符在一个 struct 的直接成员或方法的参数中必须唯一,但不需要在不同 struct 或方法之间保持唯一。
    • 配置一致性:对于 struct 同一层级的所有成员,要么全部定义数据标识符,要么全部不定义;对于方法的所有参数,也是如此。
  • 数据类型编码

    • 除了数据标识符,还使用 “线类型(wire type)” 来编码成员的数据类型,两者共同组成 “标签(tag)”。
    • 标签结构:标签长度为两个字节,其布局包含多个部分,包括保留位、线类型、数据标识符等。例如,保留位在第 7 位,线类型在第 6 - 4 位,数据标识符在第 3 - 0 位和第二个字节的全部 8 位。
      在这里插入图片描述
  • 不同数据类型的序列化规则

    • 基本数据类型:如果序列化的成员或参数是基本数据类型(线类型 0 - 3)且配置了数据标识符,标签应直接插入在成员或参数前面,并且不插入长度字段。
    • 复杂数据类型:如果是复杂数据类型(线类型 4 - 7)且配置了数据标识符,标签应插入在长度字段前面,并且必须插入长度字段。
  • 长度字段相关规则

    • 长度字段始终包含到 struct 中下一个标签的长度。对于 struct、动态长度字符串、动态长度数组、联合类型等,都有相应的长度字段规则,且这些类型的长度字段大小在配置中应大于 0,并且通常应配置为相同大小,以便在处理未知成员或参数时,接收方能够根据统一的规则来解析数据。
  • 可选成员处理

    • 序列化器在序列化时,如果可选成员被标记为不可用,不应将其包含在序列化字节流中;反序列化器在反序列化时,应忽略字节流中不存在的可选成员。
  • 未知数据处理

    • 如果反序列化器读取到未知的数据标识符,它应根据线类型和长度字段的信息跳过未知的成员或参数;如果在字节流中找不到必需的(非可选)成员或参数,反序列化应中止,并将消息视为格式错误。
  • 接口版本与序列化兼容性

    • 如果对现有服务接口引入带标签的序列化,而之前未使用标签,应增加主要接口版本来指示这一变化。
  • 带有标签的序列化示例
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

5. 数组

5.1 固定长度数组

  • 长度定义

    • 固定长度数组的长度由数据类型定义确定。可以将其视为相同类型元素的重复排列。
    • 例如,一维固定长度数组携带指定数量(n)的相同类型元素,其布局按照顺序依次排列,元素大小乘以元素数量就是数组占用的空间大小。
      在这里插入图片描述
    • 多维固定长度数组的序列化遵循编程语言中的内存布局(行主序)。
      在这里插入图片描述
  • 长度处理与错误情况

    • 如果接收到的固定长度数组长度大于预期(根据数据类型定义),只解释指定数量的元素,多余字节根据长度字段跳过。
    • 如果长度小于预期且接收方无法提供缺失数据的替代值,反序列化将中止,消息视为格式错误。

5.2 动态长度数组

  • 布局与长度字段

    • 动态长度数组的布局基于固定长度数组,可以在数组开头使用可选的长度字段来指定数组字节长度。
    • 长度字段长度可以是 0、8 位、16 位或 32 位,由配置决定。当长度字段设置为 0 位时,数组元素数量固定,此时相当于固定长度数组。
      -长度不包括长度字段本身大小。
      在这里插入图片描述
  • 多维数组特点

    • 在多维动态长度数组中,每个不同维度的子数组都有自己的长度字段。

    • 如果需要静态分配缓冲区大小,数据类型定义应指定每个维度的最大长度。
      在这里插入图片描述

    • 当测量字节长度时,复杂多维数组在反序列化时可以跳过。

    • SOME/IP 支持同一维度中列和行的不同长度,每个动态长度数组前都需要有长度指示。

  • 长度处理与错误情况

    • 如果动态长度数组长度大于预期,只解释指定数量的元素,多余字节根据长度字段跳过。

5.3 Enumeration(枚举)

  • 枚举在 SOME/IP 中不作为独立类型考虑,而是被当作无符号整数数据类型传输。

5.4 Bitfield(位域)

  • 位域应作为无符号数据类型(uint8/uint16/uint32)传输,数据类型定义可以指定每个位的名称和值。

5.5 Union/Variant(联合 / 变体)

  • 联合用于在网络上传输具有不同数据类型的可选数据,由长度字段、类型选择器和有效负载组成。
    在这里插入图片描述

  • 长度字段定义数据和填充字节的大小(不包括长度字段和类型字段本身),类型字段指定数据类型,有效负载根据类型字段进行序列化。

  • 长度字段长度由配置决定,可以是 32 位、16 位、8 位或 0 位,当长度字段为 0 位时,联合中的所有类型必须长度相同。

  • 类型字段的值由配置为每个联合单独定义,其中 0 值保留用于空类型(表示空联合),并且是否允许空联合也由配置决定。

总结

整体来说,SOME/IP的序列化和反序列化比较死板,不够灵活。

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

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

相关文章

【AndroidAPP】权限被拒绝:[android.permission.READ_EXTERNAL_STORAGE],USB设备访问权限系统报错

一、问题原因 1.安卓安全性变更 Android 12 的安全性变更,Google 引入了更严格的 PendingIntent 安全管理,强制要求开发者明确指定 PendingIntent 的可变性(Mutable)或不可变性(Immutable)。 但是&#xf…

C之(14)gcov覆盖率

C之(14)gcov覆盖率 Author: Once Day Date: 2024年12月30日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: C语言_Once-Day的博客-CSDN博客 前些天…

简易屏幕共享工具-基于WebSocket

前面写了两个简单的屏幕共享工具,不过那只是为了验证通过截屏的方式是否可行,因为通常手动截屏的频率很低,而对于视频来说它的帧率要求就很高了,至少要一秒30帧率左右。所以,经过实际的截屏工具验证,我了解…

Paperlib(论文管理工具)

Paperlib 是一个简单好用的论文管理工具。软件接入各学科数据库用于匹配论文元数据,逐步为每一个学科(例如计算机科学,物理学等)定制化数据库组合提高检索精度。尤其是精准的会议论文元数据检索能力。还可以管理你的论文&#xff…

c# 2024/12/27 周五

6《详解类型、变量与对象》36 详解类型、变量与对象 _1_哔哩哔哩_bilibili

Formality:匹配(match)是如何进行的?

相关阅读Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 匹配点、对比点和逻辑锥 匹配指的是Formality工具尝试将参考设计中的每个匹配点与实现设计中的相应匹配点进行配对,这里的匹配点包括对比点(Compare Point…

分布式算法(五):初识ZAB协议

文章目录 一、什么是Zookeeper二、ZAB与Zookeeper的关系为什么Zookeeper不直接使用Paxos 三、ZAB简介1.名词解释提案(Proposal)事务(Transaction)原子广播(Atomic Broadcast) 2.集群角色领导者(…

Mybatis 01

JDBC回顾 select 语句 "select *from student" 演示: 驱动包 JDBC 的操作流程: 1. 创建数据库连接池 DataSource 2. 通过 DataSource 获取数据库连接 Connection 3. 编写要执⾏带 ? 占位符的 SQL 语句 4. 通过 Connection 及 SQL 创建…

tensorboard的界面参数与图像数据分析讲解

目录 1.基础概念: (a)精确率与召回率: (b)mAP: (c)边界框损失: (d)目标损失: (e)分类损失: (f):学习率: 2.设置部分(最右边部分): GENERAL(常规设置…

《计算机网络A》单选题-复习题库解析-2

目录 51、下列关于以太网网卡地址特点的说法中,不正确的是( )。 52、当一个Web Browser向一个使用标准服务器端口的Web Server提出请求时,那么在服务返回的响应包中,所使用的源端口是( &#xff0…

Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录

Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录 由于网上很多的mysql8.0安装教程都是老版本或者安装过程记录有问题,导致经常安装到一半需要删除重新安装。所以将成功的实操安装过程记录一下,方面后面查阅,大家还有问题的可以在此讨…

高等数学学习笔记 ☞ 无穷小与无穷大

1. 无穷小 1. 定义:若函数当或时的极限为零,那么称函数是当或时的无穷小。 备注: ①:无穷小描述的是自变量的变化过程中,函数值的变化趋势,绝不能认为无穷小是一个很小很小的数。 ②:说无穷小时…

KMP 2024 年总结,Kotlin 崛起的一年

2024 Google I/O 上正式官宣了 KMP(Kotlin Multiplatform)项目,它是 Google Workspace 团队的一项长期「投资」项目,由 JetBrains 开发维护和开源的项目,简单来说,JetBrains 主导,Google Worksp…

【SpringBoot教程】搭建SpringBoot项目之编写pom.xml

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 👏今天毛毛张分享的内容主要是Maven 中 pom 文件🆕,涵盖基本概念、标签属性、配置等内容 文章目录 1.前言🥭2.项目基本…

【Java 学习】详讲代码块:控制流语句代码块、方法代码块、实例代码块(构造代码块)、静态代码块、同步代码块

💬 欢迎讨论:如对文章内容有疑问或见解,欢迎在评论区留言,我需要您的帮助! 👍 点赞、收藏与分享:如果这篇文章对您有所帮助,请不吝点赞、收藏或分享,谢谢您的支持&#x…

【亚马逊云科技】基于Amazon EKS部署高可用的OceanBase的最佳实践

一、前言 随着企业业务的快速发展和数据量的不断增长,高性能、高可用的数据库解决方案成为了关键需求。OceanBase作为一款分布式关系型数据库,以其高扩展性、高可用性和高性能的特点,逐渐受到企业的广泛关注。然而,在复杂的分布式…

【工具】—— SpringBoot3.x整合swagger

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务的接口文档。Swagger简单说就是可以帮助生成接口说明文档,操作比较简单添加注解说明,可以自动生成格式化的文档。 项目环境 jdk17SpringBoot 3.4.0Sp…

从0入门自主空中机器人-2-1【无人机硬件框架】

关于本课程: 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程,包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程,带你从0开始,组装属于自己的自主无人机,并让…

基于视觉语言模型(VLM)的CogAgent

前言 CogAgent 是由清华大学与智谱AI联合推出的一个多模态大模型,专注于图形用户界面(GUI)的理解和导航。它代表了在视觉语言模型(VLM)领域的一项重要进展,特别是在GUI Agent能力方面。相较于传统的基于文…

win10、win11-鼠标右键还原、暂停更新

系统优化 win 10jihuo win 11jihuo鼠标右键还原暂停更新 update 2024.12.28win 10 jihuo winx,打开powershell管理员,输入以下命令,选择1并等待 irm https://get.activated.win | iex参考:https://www.bilibili.com/video/BV1TN411M72J/?sp…