这就引出了变长结构体的概念。 2、 什么叫变长结构体? 如下所示: struct Var_Len_Struct { int nsize; char buffer[0]; }; 那结构体是怎么实现可变长的呢?如上所示,请注意看结构体中的最后一个元素,一个没有元素的数组。我们可以通过动态开辟一个比结构体大的空间,然后让buffer去指向那些额外的空间,这...
3、变长结构体的好处体现在哪? 可能有的同学会问到,1引出部分如果说定义定长数组浪费空间,定义一个指针不也能指向变长的数据域部分吗? 是的,是可以实现的。那么我们就对比下有什么不同。 结构体1:s_one,用指针指向数据域部分; 结构体2:s_two, 用[0]的数组; 结构体3:s_three, 因为有的编译器不支持[0...
xfrm_algo是一个定义密钥算法的结构体,alg_name存放算法名称,alg_key_len存放密钥长度(单位是bit),alg_key存放密钥. 因为同一个算法,有可能会使用不同长度的密钥。 如AES, 就有128位、192位和256位三种密钥。 所以,在定义这样一个密钥算法的结构体时,就要求不定长的结构体,而零长数组就可实现这一点。 当然...
变长结构体 变长结构体是由gcc扩展的一种技术,它是指其最后一个成员的长度不固定(flexible array member,也叫柔性数组),先来看一个简单的例子: #include <stdlib.h>#include<stdio.h>#pragmapack(1)typedefstruct{inta;charb[10];char*vector;} cq;#pragmapack()intmain() { cq*a = malloc(sizeof(cq...
简介:本文是对深入浅出变长结构体的详解。 1、 问题的引出 项目中用到数据包的处理,但包的大小是不固定的,其长度由包头的2字节决定。比如如下的包头:88 0f 0a ob cd ef 23 00。长度由头2个字节880f决定,考虑字节序,转为0f88,转为10进制3976个字节的包长度。
正常的结构体,大小计算有一定的规则,它要考虑成员变量的类型和对齐方式。 可变长结构体就有点调皮啦。比如说,结构体里有个数组,这个数组的大小可能是根据程序运行中的某些情况才确定的。对于这种变长结构体,简单地用常规的`sizeof`操作符可就不太够啦。 一种常见的办法呢,如果这个变长部分是数组,而且你知道这个...
深入浅出变长结构体 1、 问题的引出 项目中用到数据包的处理,但包的大小是不固定的,其长度由包头的2字节决定。比如如下的包头:88 0f 0a ob cd ef 23 00。长度由头2个字节880f决定,考虑字节序,转为0f88,转为10进制3976个字节的包长度。 这个时候存储包的时候,一方面可以考虑设定包的大小固定:如4K=4*102...
最近接到一个需求,需要使用 Python 解析 C 来的数据包,而数据包中的格式是通过如下结构体定义的: 其中的 msg_data 字符串的长度是由 msg_len 给出的,...
小技巧:变长结构体设计 在设计网络协议过程中,一般会有数据包头和数据包体。通常情况下,数据包头和数据包体长度是固定的。但是在某些特殊场景下,需要传输的数据量不是固定的,这个时候,就需要在数据包体中引入变长结构体的设计了。以下是参考代码: 数据包头:...
如何定义变长的TLV结构体? 如何定义变长的TLV结构体? TLV是一种常用的用于通信的结构体格式。T表示tag,L表示length,V表示value。其中T和L是固定大小的,V是可变大小,L表示的是V的长度。通常用于结构化网络通信中的数据流。如0x3 3 'aa\0',0x3 5 'aaaa\0',其中0x3表示tag的值,3 or 5表示的是后面的...