首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将C结构转换为TLV格式或平面内存缓冲区

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

Stack Overflow用户
提问于 2013-08-06 16:27:28
回答 1查看 9.1K关注 0票数 4

我需要将一个C结构转换成TLV格式并将其发送过去。有人能帮我吗?我的结构是一个非常嵌套的结构,有很多指向不同结构的方向(指针),还有很多空洞*。所以,我被困住了,需要帮助。

代码语言:javascript
运行
复制
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];    
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-06 17:33:10

TLV代表标记长度值,这正是它的意义所在。在这一点上你可能有些困惑。通常情况下,当您得到一个大的字节缓冲区时,可能是从某个串行设备中填充的,您需要知道该缓冲区中包含了什么。

例如,SIM卡与电话之间的通信。有许多定义良好的标记,每个标记对应将被解码的消息类型。(这些都是在规范中定义的,如ISO 7816-4),例如,如果您想写入SIM卡中的二进制文件,您需要告诉SIM卡要发送多少字节的数据。因此,您可以构造一些信息,比如:

代码语言:javascript
运行
复制
   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能够读取这些值,我们需要定义标记:

代码语言:javascript
运行
复制
// 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

理想情况下,由于在每个结构中都嵌入了数据,所以您也应该有子标记:

代码语言:javascript
运行
复制
// 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

因此,您的每个结构都会像往常一样填充数据,然后当您发送数据时,您会将这些值解构到一个缓冲区中。下面的伪代码给出了这样的想法

代码语言:javascript
运行
复制
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,然后解析出字段并填充。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18085578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档