парсинг базы данных mnist c

Я пытаюсь разобрать базу данных рукописных чисел MNIST. Однако, когда я смотрю на значения, которые он дает мне, когда я использую fread, они неверны. Я изменил порядок следования байтов, но числовые значения по-прежнему неверны. Ссылка на базу данных здесь: http://yann.lecun.com/exdb/mnist/

int ChangeEndianness(int value) {
    int result = 0;
    result |= (value & 0x000000FF) << 24;
    result |= (value & 0x0000FF00) << 8;
    result |= (value & 0x00FF0000) >> 8;
    result |= (value & 0xFF000000) >> 24;
    return result;
}

FILE *imageTestFiles = fopen("train-images-idx3-ubyte.gz","r");

if(imageTestFiles == NULL) {
    perror("File Not Found");
}
int magic_number_bytes;
fread(&magic_number_bytes, sizeof(int), 1, imageTestFiles);
printf("%d\n", ChangeEndianness(magic_number_bytes));

Все, что это должно сделать, это напечатать «магическое число», которое равно 2049 или 0x00000801, но вместо этого оно напечатает 529205256, которое равно 0x1F8B0808. Я новичок в C, всегда использовал Java заранее. Заранее спасибо!


person Kaiwen Chen    schedule 13.12.2015    source источник
comment
Вы знаете, что расширение gz указывает на то, что файл данных сжат, поэтому вам сначала нужно распаковать его, прежде чем вы сможете прочитать из него свои данные?   -  person Jongware    schedule 13.12.2015
comment
Все еще не работает. Первое, что говорит ссылка, это то, что файл может быть в формате .gz при загрузке. Я избавился от него, когда повторно сохранил файл в своем проекте кодирования, но он по-прежнему печатал то же самое большое число, начинающееся с 5. Поэтому я просто переключил его обратно на .gz, потому что не мог понять, что не так.   -  person Kaiwen Chen    schedule 13.12.2015
comment
Вы можете найти уже декодированную версию набора данных MNIST здесь: mnist-decoded.000webhostapp.com   -  person SomethingSomething    schedule 31.03.2017


Ответы (1)


Файл необходимо сначала распаковать, а не просто удалить расширение gz.

Можно сказать, что ваш код работает со сжатым файлом, потому что 0x1F8B — это магическое число для формата файла gzip.

Если xxd используется для отображения содержимого файла после загрузки, вы получите наблюдаемое 0x1F8B0808:

$ xxd -p train-images-idx3-ubyte.gz | head -c 8
1f8b0808

Однако, если вы распаковываете файл:

$ gunzip train-images-idx3-ubyte.gz
$ xxd -p train-images-idx3-ubyte | head -c 8
00000803

вы получаете ожидаемое магическое число для данных MNIST.

person gderham    schedule 11.01.2016