mnist数据库解析c

时间:2015-12-13 00:12:26

标签: parsing endianness mnist

我正在尝试解析手写号码的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));

所有这一切都应该打印出#34;幻数&#34;这是2049或0x00000801,但它打印529205256,即0x1F8B0808。我是C的新手,总是事先使用Java。提前谢谢!

1 个答案:

答案 0 :(得分:0)

首先必须解压缩文件,而不是简单地删除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数据的预期幻数。