我从以下位置解析C#中的MNIST数据集:

我正在尝试从二进制文件中读取第一个Int32

FileStream fileS = new FileStream(fileName, FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(fileS);
int magicNumber = reader.ReadInt32();


但是,它给了我一个无意义的数字:50855936。

如果我使用File.ReadAllBytes()

buffer = File.ReadAllBytes(fileName);


然后查看字节,它工作正常(前四个字节现在代表2049),BinaryReader我怎么了?

文件格式如下(我正在尝试读取第一个幻数):

All the integers in the files are stored in the MSB first (high endian) format used by most non-Intel processors. Users of Intel processors and other low-endian machines must flip the bytes of the header.


训练设置标签文件(train-labels-idx1-ubyte):

[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000801(2049) magic number (MSB first)
0004     32 bit integer  60000            number of items
0008     unsignebyte     ??               label
0009     unsigned byte   ??               label
........
xxxx     unsigned byte   ??               label
The labels values are 0 to 9.d

最佳答案

50855936 == 0x03080000。或者,当反转字节时为0x00000803,这是几乎所有机器上都需要的,因为little-endian赢得了鸡蛋大战。足够接近2049,不知道是什么解释了2的偏移量。这是一个扩展方法可以帮助您阅读:

  public static class BigEndianUtils {
      public static int ReadBigInt32(this BinaryReader br) {
          var bytes = br.ReadBytes(sizeof(Int32));
          if (BitConverter.IsLittleEndian) Array.Reverse(bytes);
          return BitConverter.ToInt32(bytes, 0);
      }
  }


如果文件包含更多字段类型,请添加其他方法,只需在代码段中替换Int32。

10-04 16:09