Apollo record文件格式

Apollo record文件格式

1 Record文件总体格式

Record文件由许多的Section组成:

在这里插入图片描述

  • Section Type为枚举类型,大小为8字节(来自apollo/cyber/proto/record.proto文件):
enum SectionType {
  SECTION_HEADER = 0;
  SECTION_CHUNK_HEADER = 1;
  SECTION_CHUNK_BODY = 2;
  SECTION_INDEX = 3;
  SECTION_CHANNEL = 4;
};
  • 第一个Section 0为HEADER类型。
  • 每个CHUNK_HEADER类型的Section后,必然跟着一个CHUNK_BODY。
  • 除此之外,其他位置的Section没有固定类型。
  • Data Size为int64_t类型,8字节,表示Data的长度。
  • Data为数据部分。

2 Section中的Data格式

2.1 HEADER Data

  • HEADER Data包含了record文件的基本信息,其有效长度由Data Size指定。
  • 注意,Data Size的值不一定等于Header结构体的大小。
  • 整个HEADER Data在文件中会占据2048字节,多出来的位置需填充。
  • Header结构体定义(来自apollo/cyber/proto/record.proto文件):
message Header {
  optional uint32 major_version = 1;
  optional uint32 minor_version = 2;
  optional CompressType compress = 3;
  optional uint64 chunk_interval = 4;
  optional uint64 segment_interval = 5;
  optional uint64 index_position = 6 [default = 0];
  optional uint64 chunk_number = 7 [default = 0];
  optional uint64 channel_number = 8 [default = 0];
  optional uint64 begin_time = 9 [default = 0];
  optional uint64 end_time = 10 [default = 0];
  optional uint64 message_number = 11 [default = 0];
  optional uint64 size = 12 [default = 0];
  optional bool is_complete = 13 [default = false];
  optional uint64 chunk_raw_size = 14;
  optional uint64 segment_raw_size = 15;
}
enum CompressType {
  COMPRESS_NONE = 0;
  COMPRESS_BZ2 = 1;
  COMPRESS_LZ4 = 2;
};

2.2 CHUNK_HEADER Data

  • ChunkHeader Data 包含了紧跟其后的ChunkBody Section的信息。
  • 定义(来自apollo/cyber/proto/record.proto文件):
message ChunkHeader {
  optional uint64 begin_time = 1;
  optional uint64 end_time = 2;
  optional uint64 message_number = 3;
  optional uint64 raw_size = 4;
}

2.3 CHUNK_BODY Data

  • ChunkBody Data是一个SingleMessage类型的数组。
  • 定义(来自apollo/cyber/proto/record.proto文件):
message ChunkBody {
  repeated SingleMessage messages = 1;
}
message SingleMessage {
  optional string channel_name = 1;
  optional uint64 time = 2;
  optional bytes content = 3;
}

2.4 INDEX Data

  • Index Data包含一个SingleIndex类型数组,作为Section的索引,保存了Channel、ChunkHeader、ChunkBody三种Section的位置和简要数据。
  • Index定义(来自apollo/cyber/proto/record.proto文件):
message Index {
  repeated SingleIndex indexes = 1;
}
message SingleIndex {
  optional SectionType type = 1;
  optional uint64 position = 2;
  oneof cache {
    ChannelCache channel_cache = 101;
    ChunkHeaderCache chunk_header_cache = 102;
    ChunkBodyCache chunk_body_cache = 103;
  }
}
message ChunkHeaderCache {
  optional uint64 message_number = 1;
  optional uint64 begin_time = 2;
  optional uint64 end_time = 3;
  optional uint64 raw_size = 4;
}
message ChunkBodyCache {
  optional uint64 message_number = 1;
}
message ChannelCache {
  optional uint64 message_number = 1;
  optional string name = 2;
  optional string message_type = 3;
  optional bytes proto_desc = 4;
}

2.5 CHANNEL Data

  • Channel定义(来自record.proto文件):
message Channel {
  optional string name = 1;
  optional string message_type = 2;
  optional bytes proto_desc = 3;
}

3 序列化与反序列化

3.1 序列化

  • 生成record文件时,需要将每个Section的数据部分通过protobuf提供的函数进行序列化。
  • apollo/cyber/record/file/record_file_writer.h文件中:
google::protobuf::io::FileOutputStream raw_output(fd_);
message.SerializeToZeroCopyStream(&raw_output);

3.2 反序列化

  • 读取record文件时,需要将每个Section的数据部分通过protobuf提供的函数进行反序列化。
  • apollo/cyber/record/file/record_file_reader.h文件中:
FileInputStream raw_input(fd_, static_cast<int>(size));
CodedInputStream coded_input(&raw_input);
CodedInputStream::Limit limit = coded_input.PushLimit(static_cast<int>(size)); message->ParseFromCodedStream(&coded_input) 
coded_input.ConsumedEntireMessage()
coded_input.PopLimit(limit);
简单的使用说明书 V0.6.0: 加入文件拖放功能。 V0.5.5:修正建立新的配置文件时,保存失败的Bug。 V0.5.4:修正数制计算器中输入A-F时的bug,增加源数据存储类型选择。 0.5.3:修改图标,部分界面。 0.5.2: About 界面修改,添加更新网址。 0.5.1:修正块另存时新建文件保存失败的Bug。 0.5:新增文件内、文件间块移动、复制、交换、另存等功能 0.4:新增转换为二进制后比较功能 本人继MCUTool以后的另外一个单片机开发实用工具软件,用于单片机调试过程中简单的参量修改,省略修改源代码、再编译的过程,直接修改目标文件。尤其是对eeprom数据的修改、调整更为方便实用。 本软件编写的目的是用来编辑存放于单片机 Flash 或 EEPROM 中的数据,支持 Intel Hex 格式以及 Motorola S 格式的数据文件,也可以编辑二进制的内存映射文件。数据的编辑可以通过常量定义的方式,也可以通过内存映射的方式进行。 同时可以在两种16进制格式文件之间相互转换。格式转换以行数据为单位,以确保转换前后数据不会改变。 另外提供十进制、十六进制转换器,转换结果可以作为普通显示或作为内存映射,作内存映射时可以选择多字节数据的存储方式。 二进制比较功能,通过不同工具生成的Hex文件可能因为格式而无法进行文本方式比较,本工具可以首先转换为二进制数据再进行比较,免去自行转换的麻烦。 单文件内/双文件间的块操作,包括复制、移动、交换、另存等等,方便实验数据提取、复制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值