@timkin1

Как считать два байта числа?

Здравствуйте!
Объясните, пожалуйста, как реализовать данное считывание (в СИ):
имеется бинарный файл со следующим содержимым:
00 01 00 00 00 01
Первые два байта - целое число, не превышающее 2000, а дальше идут целые 32 битные числа (все big-endian).

Не могу понять как правильно считать эти числа, пытаюсь сделать через fread,  но он выводит левые цифры.

Заранее спасибо!
  • Вопрос задан
  • 1852 просмотра
Пригласить эксперта
Ответы на вопрос 3
15432
@15432
Системный программист ^_^
для 32-битных что-то типа такого. надо считать байты и развернуть их (вы же на x86 программу делаете? он little endian).
unsigned int ReadBig32(FILE * in_file)
{
    unsigned char temp[4];
    fread(temp, 1, 4, in_file);
    unsigned int result = temp[3] | (temp[2] << 8) | (temp[1] << 16) | (temp[0] << 24);
    return result;
}
Ответ написан
Комментировать
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Код писать лениво, опишу так
Числа хранятся (на обычных x86) "задом наперед". То есть если число - int (32-битное) - оно займет 4 байта, причем самый старший байт будет "в хвосте". Для примера - есть буфер, содержащий 01 02 03 04, hex разумеется (Ваш пример неудачен). Если в буфере int - то какое это число? Правильно 0x04030201.
Поэтому ничего никуда разворачивать не надо, магия С - в адресной арифметике!
tydedef struct {
short int a;
int b;
} wrk_buf;

wrk_buf my_buf;
read(desc, (void *) &my_buf, 1000);

После чего можно будет просто обращаться к полям структуры - как к обычным переменным. Понятно, что файл нужно сначала открыть, получить его размер - 1000 - условное число.
Ответ написан
Комментировать
Красиво и универсально никак, наиболее совместимый способ примерно такой:

#include <stdint.h>
#if defined (__WIN32__)
#include <Winsock2.h>
#else
#include <arpa/inet.h>
#endif

uint16_t read_16(FILE * f)
{
    uint16_t ui16;
    fread(&ui16, 1, 2, f);
    return ntohs(ui16);
}

uint32_t read_32(FILE * f)
{
    uint32_t ui32;
    fread(&ui32, 1, 4, f);
    return ntohl(ui32);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы