0

手書きの数字の 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 である「マジック ナンバー」を出力するだけですが、代わりに 0x1F8B0808 である 529205256 を出力します。私はCが初めてで、常にJavaを事前に使用していました。前もって感謝します!

4

1 に答える 1

0

gz 拡張子を単純に削除するのではなく、まずファイルを解凍する必要があります。

0x1F8Bgzip ファイル形式のマジック ナンバーであるため、コードが圧縮ファイルで動作していることがわかります。

ダウンロード後にファイル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 データの予想されるマジック ナンバーを取得します。

于 2016-01-11T14:48:28.243 に答える