序列化和反序列化位字段

jdt*_*141 6 c++ serialization protocol-buffers boost-serialization

我已经递交了一份文件,该文件定义了一组通过串行通信信道传输和接收的消息.我想将传入的消息和反序列化为对象,并序列化我的出站消息.线路上的编码是建立的并且是不可改变的,并且由报头中的各种位域和不同的有效载荷组成,例如,

class Message{
int msg_num : 7
int dest_addr : 4
bool SRR : 1
bool IDE : 1
int source_addr : 6
//... and so on...
}
Run Code Online (Sandbox Code Playgroud)

我看了一下使用protobufs,但似乎建立了他们的varint编码方法.我也看过boost-serialization,但根据我到目前为止所读到的内容,编码是如何完成的还不完全清楚.

那么,有几个问题:

  • 我可以使用boost-serialization将我的bytestream转换为对象吗?
  • 随着目标不是为推出自己的程序序列化(维修乱),有没有完成我的任务优选机制(例如,一个自定义的升压序列化存档,我还没有发现的另一种方法)

Jar*_*iuk 1

我认为您不会找到与您正在查看的自定义协议相匹配的易于使用的序列化器。但看起来您拥有的原语集(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...
}
Run Code Online (Sandbox Code Playgroud)

转换器可以编写一个函数体类似于(抽象符号并假设 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
Run Code Online (Sandbox Code Playgroud)

编码器:

{
    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
    }
}
....
Run Code Online (Sandbox Code Playgroud)

这应该很容易生成,也是确保编码是自定义的最简单的方法。