Обратное чтение WORD из двоичного файла? - PullRequest
0 голосов
/ 16 января 2011

У меня есть структура:

struct JFIF_HEADER
{
    WORD marker[2];        // = 0xFFD8FFE0
    WORD length;           // = 0x0010
    BYTE signature[5];     // = "JFIF\0"
    BYTE versionhi;        // = 1
    BYTE versionlo;        // = 1
    BYTE xyunits;          // = 0
    WORD xdensity;         // = 1
    WORD ydensity;         // = 1
    BYTE thumbnwidth;      // = 0
    BYTE thumbnheight;     // = 0
};

Вот как я читаю это из файла:

HANDLE file = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ,
                         NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
DWORD tmp = 0;
DWORD size = GetFileSize(file, &tmp);
BYTE *DATA = new BYTE[size];
ReadFile(file, DATA, size, &tmp, 0);

JFIF_HEADER header;
memcpy(&header, DATA, sizeof(JFIF_HEADER));

Так выглядит начало моего файла в шестнадцатеричном редакторе:

0xFF 0xD8 0xFF 0xE0 0x00 0x10 0x4A 0x46 0x49 0x46 0x00 0x01 0x01 0x00 0x00 0x01

Когда я печатаю header.marker, он показывает именно то, что должен (0xFFD8FFE0).Но когда я печатаю header.length, он показывает 0x1000 вместо 0x0010.То же самое относится и к xdensity и ydensity.Почему я получаю неправильные данные при чтении WORD?

1 Ответ

7 голосов
/ 16 января 2011

Вы используете процессор x86, в котором хранятся слова старшего байта (младший байтовый разряд). Бинарный файл предположительно хранится в старшем порядке.

Вам необходимо вручную поменять каждый байт в файле (или, возможно,Ваша библиотека JFIF сделает это за вас)

пс.Самый безопасный способ поменять байты - это использовать макросы ntohs () и htons () в вашей библиотеке 'C'.См. Статью wiki для деталей порядка байтов

...