我在C#中解析MNIST数据集:
http://yann.lecun.com/exdb/mnist/
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.
TRAINING SET LABEL FILE(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); } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。