在 C++ 中读取字节

Sev*_*ays 6 c++ binary byte c++11

我正在尝试从二进制文件中读取字节,但没有成功。我尝试了很多解决方案,但没有得到结果。文件结构:

[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000803(2051) magic number 
0004     32 bit integer  60000            number of images 
0008     32 bit integer  28               number of rows 
0012     32 bit integer  28               number of columns 
0016     unsigned byte   ??               pixel 
0017     unsigned byte   ??               pixel 
........ 
xxxx     unsigned byte   ??               pixel
Run Code Online (Sandbox Code Playgroud)

我是如何尝试的(不起作用):

auto myfile = fopen("t10k-images.idx3-ubyte", "r");
char buf[30];
auto x = fread(buf, 1, sizeof(int), myfile);
Run Code Online (Sandbox Code Playgroud)

Who*_*aig 1

了解文件布局的字节顺序,因此读取多字节数字非常重要。假设大尾数始终是写入格式,并且假设该值确实是 32 位无符号值:

uint32_t magic = 0;
unsigned char[4] bytes;
if (1 == fread(bytes, sizeof(bytes), 1, f))
{
   magic = (uint32_t)((bytes[0] << 24) | 
                      (bytes[1] << 16) | 
                      (bytes[2] << 8) | 
                      bytes[3]);
}
Run Code Online (Sandbox Code Playgroud)

注意:无论读取器(您的程序)是小端还是大端,这都将起作用。我确信我至少错过了其中的一个演员,但希望你明白这一点。读取多字节数字的唯一安全且可移植的方法是(a)了解写入它们的字节顺序,以及(b)逐字节读取和组装它们。