数据包格式设计

设计思路

<header><data>

总构成为header和data

header

<header_len><header><data_len><填充>

header的大小固定为4KB,这是因为header在文件头,但header的数据必须在录制完成后才能生成,因此需要先填充固定大小空间备用。

命名描述格式长度
header_len接下来的header的长度uint32_t4字节
header整个包的头部信息复杂格式变量,为header_len字节
data_len包的数据部分的长度uint64_t8字节
填充0x20空格填充剩余区域char4096-4-header_len-8字节

header具体内容

<field1_len><field1_name>=<field1_value><field2_len><field2_name>=<field2_value>...<fieldN_len><fieldN_name>=<fieldN_value>
命名描述格式长度
fieldX_len单位为字节,表示接下来name和value的长度uint32_t4字节
fieldX_name属性名字符串变量,终止的符号为’=’
fieldX_value属性值由属性特指变量,由len - name的长度得到

属性名举例

  • topic 话题名称
  • compression 压缩方式(暂时不加)
  • time 接收到该话题的时间

data

<message 1><message 2>...<message N>

每个message为一个消息,可以属于不同的话题

message

<msg_header_len><msg_header><msg_len><msg_data>[ptr_len 1][ptr_data 1]...[ptr_len N][ptr_data N]
命名描述格式长度
msg_header_lenmsg_header的长度uint32_t4字节
msg_header该消息的头部信息和上面的header类似变量,由msg_header_len指定
msg_len消息数据的长度uint32_t4字节
msg_data由结构体转换的消息数据二进制字节流由msg_len指定
ptr_len指针数据长度,取决于头信息的定义,可以没有uint32_t4字节
ptr_data指针数据,取决于头信息的定义,可以没有二进制字节流变量,由ptr_len指定

根据长度信息可以探测到下一个消息的位置,消息是按照到来时间升序排列。
由于缺少索引,所以还不能支持随机访问。

结构体解决方案,先写入结构体,再依次写入结构体中的指针,从而达成目的。
指针的数量,以及每个指针的大小都由头部信息所储存。(指针内容的存放按照结构体的顺序)

demo中遇到的问题汇总

  1. header中属性未制订标准
  2. 指针数据的存放相关问题
  3. 属性名称和值的最大长度未指定,不方便设置缓冲数组的大小

问题修正

header问题修正

属性列表

  • topic 话题名称,在头部信息中可以出现多次,说明有多个话题
  • start_time 开始录制话题的时间
  • end_time 录制话题结束的时间
  • recive_time 接收到消息的时间
  • ptr_num 指针类型变量的数量

属性名称和值的最大长度

设置为64B,这里需要注意去除掉字符串的终止符。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值