gpt4 book ai didi

c - 如何将 C 结构转换为 TLV 格式或平面内存缓冲区

转载 作者:太空狗 更新时间:2023-10-29 16:12:59 24 4
gpt4 key购买 nike

我需要将一个 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];
};

最佳答案

TLV 代表标记长度值,这正是它的含义。您可能对这一点有些困惑。正常用法是当您获得一个大的字节缓冲区时,可能是从某个串行设备填充的,并且您需要知道该缓冲区中的内容。

以 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生成一个“struct a”发送给客户端B。(必须有一个“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 获得大量数据缓冲区时,他们可以构造自己的本地 struct astruct bstruct c 然后解析字段并填充。

关于c - 如何将 C 结构转换为 TLV 格式或平面内存缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18085578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com