6

シリアル通信チャネルを介して送受信される一連のメッセージを定義するドキュメントが渡されました。受信メッセージを取得してオブジェクトに逆シリアル化し、送信メッセージもシリアル化したいのですが。有線でのエンコードは確立されており、変更できません。ヘッダー内のさまざまなビットフィールドとさまざまなペイロードで構成されます。

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エンコード方法が確立されているようです。ブーストシリアル化についても見てきましたが、これまで読んだ内容に基づくと、そこでエンコードがどのように行われるかは完全には明確ではありません。

だから、いくつかの質問:

  • ブーストシリアル化を使用してバイトストリームをオブジェクトに変換できますか?
  • シリアル化のために自分のルーチンをロールする必要がないことを目標に(メンテナンスの混乱)、私のタスクを実行するための好ましいメカニズムがあります(たとえば、カスタムブーストシリアル化アーカイブ、私が発見していない別の方法)
4

2 に答える 2

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...
}

コンバーターは、(抽象表記と 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
    }
}
....

これは非常に簡単に生成でき、エンコーディングがカスタムであることを確認する最も簡単な方法です。

于 2012-02-19T00:13:04.643 に答える
0

単一のプラットフォームのみに制限されている場合 (つまり、シングル バイト オーダーに制限されている場合)、および Message が POD タイプである場合は、メッセージを として宣言できますprimitive

それ以外の場合、少なくとも boost.serialization の場合は、コード、つまり「シリアル化のルーチン」を記述する必要があります。少なくともバイトオーダー変換をサポートしています

[編集] 違いprimitiveます。連載ドキュメントの奥深くで迷っています。

于 2016-02-10T22:22:52.357 に答える