Создание новой переменной в C только из части существующего u_char - PullRequest
0 голосов
/ 15 июня 2010

Я пишу некоторый 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_hdr->len и wifi_hdr_len соответственно), плюс 4 байта в конце контрольной суммы.

Однако, как я могу создать переменную frame_body без конечной контрольной суммы?Прямо сейчас я инициализирую его содержимым пакета, начинающимся с позиции после двух заголовков, но есть ли способ начать с этой позиции и завершить 4 байта до конца packet?packet - это указатель на u_char, если он помогает.

Я новый программист на C, поэтому любые советы по поводу моего кода, которые вы можете дать мне, будут очень благодарны.Спасибо!

Ответы [ 2 ]

1 голос
/ 15 июня 2010

Ваш frame_body - это просто указатель на начало кадра, указывающий на существующий буфер, в котором находятся данные.

Это прекрасно, вы можете просто передать это вместе со своим frame_body_len и попросить всех, кто заботится о данных, только проверять данные, начиная с frame_body, и не заботиться ни о чем, кроме frame_body_len - вот что вам придется делать в любом случае.

Таким образом, вам действительно не нужно иметь frame_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 );
1 голос
/ 15 июня 2010

Я думаю, это то, что вы описываете:

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 */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...