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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 09:33:10

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   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
代码运行次数:0
运行
AI代码解释
复制
// 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
代码运行次数:0
运行
AI代码解释
复制
// 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
代码运行次数:0
运行
AI代码解释
复制
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

复制
相关文章
如何删除对象的某个属性(对象属性方法是什么)
const object = { ‘a’: 1, ‘b’: ‘2’, ‘c’: 3 };
全栈程序员站长
2022/07/29
4.5K0
如何遍历JavaScript中对象属性
在2016年6月发布的ECMAScript 2016的同一时期,令JavaScript开发人员开心的是知道另一组很棒的提案已经达到了第4阶段(完成)。
疯狂的技术宅
2019/03/27
3.6K0
如何遍历JavaScript中对象属性
java反射获取Object的属性和值,包括单个对象,list集合里面的多个对象
import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 反射处理Bean,得到里面的属性值 * * @author liulinsen * */ public class ReflexObjectUtil { /** * 单个对象的所有键值 *
一写代码就开心
2020/12/18
8.8K0
JavaScript——对象的属性
在JavaScript中,所有的对象都是一组属性的集合,属性可以是数值,字符串等原始类型,也可以是函数,或者是其他对象。
Html5知典
2019/11/26
2.5K0
Javascript如何合并两个对象的属性[ 总结 ]
上面的代码会将obj2的所有属性添加到obj1对象中,如果你想到的是obj1未修改的,这可能不是你想要的结果。
IT工作者
2022/01/26
4.1K0
JavaScript之面向对象的概念,对象属性和对象属性的特性简介
  一、大家都知道,面向对象语言有一个标志,那就是他们都有类的概念,通过类我们可以创建任意多个具有相同属性和方法的对象。但ECMAScript(指定JavaScript标准的机构,也就是说JavaScript是实现其标准的扩展)并没有类的概念,因此他的对象和基于类的语言中的对象有所不同,ECMAScript把对象定义为:"无需属性的集合,其属性可以包含基本值、对象或者函数"。严格的来说,这就相当于说对象是一组没有特定顺序的值。对象的每个属性或方法都有一个名字,而每个名字都映射到一个值。正应为这样,我们可以把
郑小超.
2018/01/24
2.4K0
javascript如何去除对象的某个属性「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128151.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/31
1.4K0
对象属性的遍历
爱学习的前端歌谣
2023/10/24
1800
对象属性的遍历
将数组中多个对象的同名属性值取出合并成新数组
业务中需求的方法,接口返回一个数组,里面包含了大量的对象,具有同名的属性名,比较常见。但是需要将其中参数为name的属性值全部取出,合并成数组。
子舒
2023/08/23
5400
如何判断对象里有某个属性
剁椒鱼鳞
2023/06/06
3440
如何判断对象里有某个属性
如何从JavaScript对象中删除属性?
在使用 JavaScript 中的对象时,你可能会遇到需要从对象中完全删除属性的情况。为实现这一点可以有好几个选择:
疯狂的技术宅
2021/04/01
12.4K0
多个Promise对象的处理
如果某件事情需要依照多个对象完成后才能执行,那么我们可以使用Promise.all来管理,将这些状态全部执行完毕后才执行下一个!
十月梦想
2018/10/09
1.1K0
如何高效找出对象发生变化的属性
如图,假设选项A固定,可增删,不可改变,选项B可自定义但不可重复,并且横向对应A:出行,B:去公园,value:1,以此类推
疯狂的KK
2020/11/09
1.5K0
如何高效找出对象发生变化的属性
Django批量更新多个属性
有时候我们需要同时(一次性)更新某个用户的多条属性。 1. 用户model如下: class User(models.Model): UID = models.CharField('员工uid', max_length=200,) name = models.CharField('员工名字', max_length=200,) mobile = models.CharField('手机号', max_length=200,) mail = models.EmailField(u'邮箱', max_lengt
BigYoung小站
2020/05/04
2.1K0
Python 类对象和实例对象访问属性的区别、property属性
下面的一个小demo,定义了一个省份类  Province ,即类对象 Province ,开辟了一块内存空间,空间中存放着 类属性 country 和 __init__()方法 。
用户7886150
2020/12/20
3.7K0
链接a对象的pathname属性
再补充一点,location具有的属性链接a对象也有,不过location对象的方法,链接a对象不一定具有。
IT工作者
2021/12/29
1.1K0
初识: 对象的属性特征
众所周知,默认情况下我们可以任意对自己定义的对象进行增删改的。但是,在某些情况下,我们不能让别人去随便修改我们定义的对象的属性,那么我们应该怎么处理呢 ?这就需要了解下对象的属性特征了。
很酷的站长
2022/12/21
8090
初识: 对象的属性特征
js对象属性
相信对于对象属性大家都或多或少的知道一些,那么本文从属性说开去,看看大家对属性的了解是否有遗漏的部分。
RobinsonZhang
2018/11/07
15.7K0
如何使用 JS 动态合并两个对象的属性
我们可以使用扩展操作符(...)将不同的对象合并为一个对象,这也是合并两个或多个对象最常见的操作。
前端小智@大迁世界
2022/06/15
6.7K0
如何使用 ref 属性获取子组件实例对象?
在 Vue 中,我们可以使用 ref 属性来获取子组件的实例对象。这个功能非常方便,可以让父组件直接访问子组件的方法和数据。本文将详细介绍如何使用 ref 属性获取子组件实例对象。
网络技术联盟站
2023/06/04
2.9K0

相似问题

合并分支,但在修改它时,master会被修改

20

我需要将最新/更新的代码从master带到我的本地分支- GH6789/learninggit

10

我可以强制推送到我的分支,然后合并到master吗?

02

如果我需要修改保龄球的内容呢?

10

如何将来自master的任何并行更改合并到我的分支中,而不修改master?

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文