fread()在不同的端机器上表现不同吗?

时间:2014-03-11 08:58:09

标签: c endianness fread

我正在阅读bmp文件的标题。我的系统和bmp文件值都是小端格式。所以我读到如下:

uint32_t fileSize;
fread(&fileSize,1,4,bmpFile);

在bmp文件中,这些字节按以下顺序排序:... 36 04 01 00 ... fileSize的结果值是66614,即:0x00010436。 我得到了正确的值,没有问题。

然而有些事困扰我。这个代码对大端机器的工作方式是否相似,或者fread()的行为方式不同而且我得到错误的0x36040100?

2 个答案:

答案 0 :(得分:4)

fread将数据“原样”读入内存,因此您的代码在大端CPU上的行为肯定不同于小端CPU。

换句话说,fread并不知道您正在阅读uint32_t。所有fread都知道您要将4个字节读取到fileSize变量所在的内存位置。

答案 1 :(得分:1)

程序中的

fread()会将36 04 01 00个字节读取到int32 fileSize变量。由于您的CPU是小端,实际上从左到右读取字节为00 01 04 36而是从右到左。因此,当您读取二进制文件时,必须将文件格式endianess转换为系统CPU endianess。