LINUX.ORG.RU

const u_char to unsigned char


0

1

Добрый день, пишу на Qt под линукс. Проблема такая: есть исходный массив с данными const unsigned char *paket.

сначала нужно из paket перевести данные в unsigned char *buf;

далее из buf нужно перевести в структуру вида :

struct data
        {
        unsigned short a1;       
        unsigned char	 a2;         
        unsigned short a3;
        unsigned short a4;
        unsigned char	 a5;
        unsigned short a6;
        unsigned short a7;
        unsigned short bufer[1200];
        };
как сделать это грамотно сделать? я пробую через memcpy, но вылезают ошибки...

Ответ на: комментарий от Gvidon

данные по одному пакету лежат в paket;

чтобы собрать несколько пакетов в один несущий смысловую нагрузку фрейм, я складываю эти пакеты в buf :

memcpy(&buf[position],&paket,size);// (size - размер пакета)
;

как только соберется buf, я копирую данные дальше:

data d;
...
memcpy(&d.Bufer,&buf[24],2400); //вот здесь сомнения, мб происходит сдвиг?
...

papa_abra
() автор топика

пишу на Qt под линукс

man QByteArray

nanoolinux ★★★★
()
Ответ на: комментарий от papa_abra

Если совсем грамотно, то поэлементно (ибо выравнивание структур никто не отменял):

data.a1 = ntohs((short)buf[0]);
data.a2 = buf[2];
/* ... */
Можно задействовать union, но опять таки не забываем про “network byte order”.

memcpy(&d.Bufer,&buf[24],2400);
_____________________^^

а вот тут у тебя imho какая-то бяка.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от Gvidon

должно хватить

Не факт. Компилятор может добавить выравнивание между a2 и a3.

sjinks ★★★
()
Ответ на: комментарий от papa_abra

Я знаю, что это значит. ☺ Но согласно твоей struct data у тебя там только 12 байт (если структура упакованна).

beastie ★★★★★
()
Ответ на: комментарий от papa_abra

Ты прикидываешься или в самом деле?

#include <stdio.h>

struct data {
        unsigned short a1;
        unsigned char   a2;
        unsigned short a3;
        unsigned short a4;
        unsigned char    a5;
        unsigned short a6;
        unsigned short a7;
        unsigned short bufer[1200];
};

struct __attribute__ ((packed)) data2 {
        unsigned short a1;
        unsigned char   a2;
        unsigned short a3;
        unsigned short a4;
        unsigned char    a5;
        unsigned short a6;
        unsigned short a7;
        unsigned short bufer[1200];
};

int
main()
{
        printf("unpacked: %d\n", sizeof(struct data));
        printf("packed:   %d\n", sizeof(struct data2));
        return 0;
}
unpacked: 2414
packed:   2412

Выводы делай сам.

PS: заполнять структуры memcpy — плохой тон и гарантированный способ выстрелить себе в ногу. Выше уже всё сказано.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от Gvidon

Такое на некоторых платформах может приводить к bus error, поэтому правильно использовать memcpy.

Reset ★★★★★
()

ок всем спасибо за ответы, разобрался

papa_abra
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.