我收到了一份文档,该文档定义了一组通过串行通信 channel 发送和接收的消息。我想接收传入的消息并将其反序列化为对象,并同时序列化出站消息。线路上的编码已建立且不可更改,并且由 header 中的各种位字段和变化的有效负载(例如
class Message{
int msg_num : 7
int dest_addr : 4
bool SRR : 1
bool IDE : 1
int source_addr : 6
//... and so on...
}
我看过使用protobufs,但看来他们的varint编码方法已经建立。我也查看了boost-serialization,但是根据我到目前为止所读的内容,那里的编码是如何完成的还不是很清楚。
因此,有几个问题:
最佳答案
我认为您找不到适合您所使用的自定义协议(protocol)的易于使用的序列化程序。但是看起来您拥有的一组原语(int,bool + size)足够简单,可以编写自己的解码器/编码器。仅根据收到的消息生成C/C++代码。生成带有这种描述的可编译代码应该是相当简单的任务。它应该是在编译时完成的自动生成-类似于protobuf/Corba所做的。
示例:从规范:
class Message{
int msg_num : 7
int dest_addr : 4
bool SRR : 1
bool IDE : 1
int source_addr : 6
//... and so on...
}
转换器可以编写类似于以下内容的函数(抽象符号并假定MSB):
解码器:
m = new Message()
{
long long val = 0
for(int i=0; i<7; i++) {
val <<= 8
val += nextByte()
}
m.msg_num = val
}
{
long long val = 0
for(int i=0; i<4; i++) {
val <<= 8
val += nextByte()
}
m.dest_addr = val
}
{
int val = nextByte()
m.SRR = val
}
{
int val = nextByte()
m.IDE = val
}
{
long long val = 0
for(int i=0; i<6; i++) {
val <<= 8
val += nextByte()
}
m.source_addr = val
}
// and so on
编码器:
{
long long val = m.msg_num
for(int i=0;i<7;i++) {
writeByte(val & 0xFF)
val >>= 8
}
}
{
long long val = m.dest_addr
for(int i=0;i<4;i++) {
writeByte(val & 0xFF)
val >>= 8
}
}
....
这应该很容易生成,并且是确保编码自定义的最简单方法。