URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7122
[ Назад ]

Исходное сообщение
"С, выравнивание int (32bit) "

Отправлено Алексей , 24-Янв-08 07:58 
подскажите пожалуйста с выравниванием
есть файл, в котором данные записаны в формате "32-bit unsigned integer (4-octet)"
к примеру:
00 00 00 02 00 00 00 04 00 00 00 E6

есть стуктура:
struct header {
    guint32 data1;
    guint32 data2;
    guint32 data3;
};
открываем и читаем файл fread(&header, sizeof(header),1,fp);
вроду все нормально, но когда делаем вывод считаных значений, то получаем их в таком виде:
data1: 2000000
data1: 4000000
data2: e6000000

подскажите, что сделать чтобы получать значения в нормальном виде


Содержание

Сообщения в этом обсуждении
"С, выравнивание int (32bit) "
Отправлено Volody , 24-Янв-08 10:20 
покажи формат вывода


"С, выравнивание int (32bit) "
Отправлено Алексей , 24-Янв-08 10:25 
>покажи формат вывода

printf("data1: %x\n", header.data1);


"С, выравнивание int (32bit) "
Отправлено Volody , 24-Янв-08 10:29 
какой размер вернул fread ?

"С, выравнивание int (32bit) "
Отправлено Алексей , 24-Янв-08 10:44 
>какой размер вернул fread ?

fread(&header, sizeof(header),1,fp);
printf("size header = %d byte\n", sizeof header);
printf("data1: %x size:%dbyte\n", header.data1, sizeof header.data1);
printf("data2: %x size:%dbyte\n", header.data2, sizeof header.data1);
printf("data3: %x size:%dbyte\n", header.data3, sizeof header.data1);

size header = 12 byte
data1: 2000000 size:4byte
data2: 4000000 size:4byte
data3: e6000000 size:4byte


"С, выравнивание int (32bit) "
Отправлено Av , 24-Янв-08 10:51 
при чем тут выравнивание? в little endian так и должно быть, превращай в big endian... ntohl() или подобные

"С, выравнивание int (32bit) "
Отправлено Алексей , 24-Янв-08 11:06 
>при чем тут выравнивание? в little endian так и должно быть, превращай
>в big endian... ntohl() или подобные

большое челевоческое спасибо :)


"С, выравнивание int (32bit) "
Отправлено Volody , 24-Янв-08 10:44 
попробуй считать файл не fread-ом, а так :
struct header h;
...
fscanf(FILE *stream, "%o%o%o", &h.data1, &h.data2, &h.data3);

"С, выравнивание int (32bit) "
Отправлено Алексей , 24-Янв-08 10:59 
>попробуй считать файл не fread-ом, а так :
>struct header h;
>...
>fscanf(FILE *stream, "%o%o%o", &h.data1, &h.data2, &h.data3);

fp = fopen("test2","r");
fscanf(fp, "%o%o%o", &h.data1, &h.data2, &h.data3);
printf("data: %x %x %x\n", h.data1, h.data2, h.data3);
fclose(fp);

output: data: bf92a6c8 804850c 0
:(