Parsing mnist数据库解析c

Parsing mnist数据库解析c,parsing,endianness,mnist,Parsing,Endianness,Mnist,我试图解析MNIST的手写数字数据库。然而,当我看到当我使用fread时它给我的值时,它们是不正确的。我已经改变了endianness,但是数值仍然不正确。数据库链接如下: int ChangeEndianness(int值){ int结果=0; 结果|=(值&0x000000FF)8; 结果|=(值&0xFF000000)>>24; 返回结果; } FILE*imageTestFiles=fopen(“train-images-idx3-ubyte.gz”,“r”); 如果(imageTest

我试图解析MNIST的手写数字数据库。然而,当我看到当我使用fread时它给我的值时,它们是不正确的。我已经改变了endianness,但是数值仍然不正确。数据库链接如下:

int ChangeEndianness(int值){
int结果=0;
结果|=(值&0x000000FF)8;
结果|=(值&0xFF000000)>>24;
返回结果;
}
FILE*imageTestFiles=fopen(“train-images-idx3-ubyte.gz”,“r”);
如果(imageTestFiles==NULL){
perror(“未找到文件”);
}
整数幻数字节;
fread(&magic_number_字节,sizeof(int),1,imageTestFiles);
printf(“%d\n”,ChangeEndianness(幻数字节));

所有这些都需要打印“幻数”,即2049或0x0000081,但它会打印一个529205256,即0x1F8B008。我对C有点陌生,总是事先使用Java。提前谢谢

首先必须解压缩文件,而不是简单地删除gz扩展名

可以看出您的代码正在压缩文件上运行,因为
0x1F8B
是gzip文件格式的神奇数字

如果下载后使用
xxd
显示文件内容,则会得到观察到的
0x1F8B008

$ 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数据的预期幻数。

您知道
gz
扩展名表示数据文件已压缩,因此您必须先对其进行解压缩,然后才能从中读取数据?仍然不起作用。链接上说的第一件事是,文件在下载时可能是.gz格式的。当我把这个文件重新保存到我的编码项目中时,我把它处理掉了,但它仍然打印出同样的大数字,以5开头。因此,我只是将其切换回.gz,因为我无法判断出问题所在。您可以在此处找到MNIST数据集的已解码版本:
$ gunzip train-images-idx3-ubyte.gz
$ xxd -p train-images-idx3-ubyte | head -c 8
00000803