4

1 つの C 構造体を TLV 形式に変換して送信する必要があります。誰かが同じことで私を助けることができますか? 私の構造は、さまざまな構造への多くの方向 (ポインター) と多くの void * を持つ、実際にネストされた構造です。だから、私は立ち往生していて、助けを使うことができます.

struct a {    
    char a[100];    
    char b;    
    struct b *tag;    
    struct c *value;    
    void *data;    
};

struct b {    
    void *data;    
    int a;    
};

struct c {    
    void *data;    
    char arr[100];    
};
4

1 に答える 1

6

TLV は Tag Length Value の略で、まさにその通りです。この点について、多少の混乱があるかもしれません。これの通常の使用法は、バイトの大きなバッファを取得し、おそらく何らかのシリアル デバイスからいっぱいになり、そのバッファに何が入っているかを知る必要がある場合です。

たとえば、SIM カードと電話の間の通信を考えてみましょう。デコードされるメッセージのタイプに対応する明確に定義されたタグがいくつかあります。(これらはすべて、ISO 7816-4 などの仕様で定義されています)。たとえば、SIM カードのバイナリ ファイルに書き込みたい場合は、送信するデータのバイト数を SIM カードに伝える必要があります。したがって、次のようなメッセージを作成します。

   A0 D0 00 00 0A 01 02 03 04 05 06 07 08 09 0A 
  +-----+     +-+ +---------------------------+
     |         |              |
    tag     length          Value

// A0D0 - the tag tells the SIM I want to "write a binary file to a GSM SIM card"
// 0A -   Says the aforementioned write will be 10 bytes in Length
// 0102... - Then the Value follows the length 

したがって、この場合、TLVを使用してバイトでいっぱいのバッファを送信し、受信デバイス(この場合はSIMカード)はタグを解析し、長さを期待することがわかっているため、送信が行われる前に「値」のバイト数を認識します完了。これは完全な真の TLV ではないことに注意してください。データの各部分には独自の TL がないためです。一部は既知のものです ( 00「タグ」と「長さ」の間にあるものなど、これらはパラメーターであり、に設定されています)。 1 バイトであり、タグや長さを必要としない場合は常に指示に従います)

それでは概要です。さて、あなたの問題はどこにあるのでしょうか? まず、お分かりいただけると思いますが、がタグ付けされるかを知る必要があります。それは誰がデータを期待しているかによって異なります。これは知っておくべきことです。あなたの問題を見ると、次のようなものだと思います。

  1. クライアント A は、クライアント B に送信する「struct a」を生成します (「struct a」タグが必要です)。
  2. 「struct a」は「struct b」と「struct c」で構成されているため、これらのタグも必要です

クライアント B がこれらの値を読み取れるようにするには、タグを定義する必要があります。

// Tags for structures
#define TAG_A 0x90       // These values are made up but it's important to note
#define TAG_B 0x91       // both Client A and Client B must know what the tags mean
#define TAG_C 0x92       // what what value they are set to

理想的には、各構造内にデータを埋め込んでいるので、サブタグも持つことになります:

// Tags for struct A:
#define TAG_A_FIX_DATA 0x93
#define TAG_A_VAR_DATA 0x94
#define TAG_B_FIX_DATA 0x95
#define TAG_B_VAR_DATA 0x96

したがって、各構造体には通常どおりデータが入力され、データを送信するときに値を分解してバッファに入れます。次の疑似コードは、アイデアを提供します

unsigned char *buffer = malloc(/*big enough for struct a+b+c+tags*/);
buffer[0] = TAG_A;
buffer[1] = /*size of your A structure*/
buffer[2] = TAG_A_FIX_DATA;
buffer[3] = 101; // for the array and the char.. if that's how you want to handle it
buffer[4-105] = a.a and a.b;
buffer[106] = TAG_B;
buffer[107] = /*length of struct B*/
...

そのため、クライアント B が大量のデータ バッファーを取得すると、独自の local を構築struct aし、フィールドを解析して入力できます。struct bstruct c

于 2013-08-06T17:33:10.420 に答える