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 バイトであり、タグや長さを必要としない場合は常に指示に従います)
それでは概要です。さて、あなたの問題はどこにあるのでしょうか? まず、お分かりいただけると思いますが、何がタグ付けされるかを知る必要があります。それは誰がデータを期待しているかによって異なります。これは知っておくべきことです。あなたの問題を見ると、次のようなものだと思います。
- クライアント A は、クライアント B に送信する「struct a」を生成します (「struct a」タグが必要です)。
- 「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 b
struct c