Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅从现有u_字符的一部分在C中创建新变量_C - Fatal编程技术网

仅从现有u_字符的一部分在C中创建新变量

仅从现有u_字符的一部分在C中创建新变量,c,C,我正在编写一些C代码来解析IEEE 802.11帧,但我一直在尝试创建一个新变量,该变量的长度取决于帧本身的大小 以下是我目前拥有的代码: int frame_body_len = pkt_hdr->len - radio_hdr->len - wifi_hdr_len - 4; u_char *frame_body = (u_char *) (packet + radio_hdr->len + wifi_hdr_len); 基本上,框架由标题、正文和结尾的校验和组成。我可以

我正在编写一些C代码来解析IEEE 802.11帧,但我一直在尝试创建一个新变量,该变量的长度取决于帧本身的大小

以下是我目前拥有的代码:

int frame_body_len = pkt_hdr->len - radio_hdr->len - wifi_hdr_len - 4;
u_char *frame_body = (u_char *) (packet + radio_hdr->len + wifi_hdr_len);
基本上,框架由标题、正文和结尾的校验和组成。我可以计算帧体的长度,方法是取数据包的长度,减去它前面出现的两个头的长度(
radio\u hdr->len
wifi\u hdr\u len
),最后加上4个字节作为校验和

但是,如果没有尾部校验和,如何创建
frame\u body
变量?现在,我正在用数据包的内容从两个头之后的位置开始初始化它,但是是否有某种方法可以从该位置开始,并在数据包的结尾之前结束4个字节<代码>数据包是指向u_字符的指针(如果有帮助的话)


我是一个新的C程序员,所以任何和所有的建议,我的代码,你可以给我将不胜感激。谢谢

我想这就是你所描述的:

u_char newVar[frame_body_len];
memcpy(newVar, frame_body, frame_body_len);
它创建一个新数组,该数组只包含帧体减去头和校验和

编辑:我刚刚想起C可能不允许声明非文字大小的数组

u_char *newVar = (u_char *)malloc(frame_body_len);

if (newVar != NULL)
{
    memcpy(newVar, frame_body, frame_body_len);
}
else
{
    /* handle allocation error here */
}

您的
frame\u body
只是一个指向帧开头的指针,指向数据所在的现有缓冲区

那很好,你可以把它和你的
frame\u body\u len
一起传递,让所有关心数据的人只检查从
frame\u body
开始的数据,而不关心
frame\u body\u len
之外的任何事情,这是你无论如何都要做的

因此,您实际上不需要有一个不包含尾部校验和的
frame\u body

如果您确实需要这样的缓冲区,例如动态分配的缓冲区,则必须为数据留出空间,并将数据复制到该缓冲区:

u_char *frame_body = malloc(frame_body_len);
if(frame_body == NULL) {
   //deal with error
}

memcpy(frame_body,&packet[radio_hdr->len + wifi_hdr_len],frame_body_len );

这与使用他所说的u_char*没有太大区别;此外,出于性能原因,我认为复制数据包的内容不是一个好主意。为什么要创建一个变量?只要使用那个指针,小心不要超过它的大小。