C:来自二进制文件的fread与原始模式不匹配后存储到缓冲区中的unsigned short

时间:2018-05-27 18:37:00

标签: c binaryfiles fread

我有一个二进制文件,在此模式后面填充2字节字(在HEX中):0XY0。这是执行fread和fopen的代码的一部分。

unsigned short buffer[bufferSize]; 
FILE *ptr;                          //

ptr = fopen(fileIn,"rb");           //

if(ptr == NULL)
{
    fprintf(stderr,"Unable to read from file %s because of %s",fileIn,strerror(errno));
    exit(20);
}

size_t readed = fread(buffer,(size_t)sizeof(unsigned short),bufferSize,ptr);
if(readed!=bufferSize)
{
    printf("readed and buffersize are not the same\n");
    exit(100);
}
//---------------------------

如果我查看缓冲区的任何内容,例如buffer [0],而不是模式为0XY0的短路,它是一个带有模式Y00X的短路 我的错误在哪里?这是关于endianess的东西吗?  当然我检查了缓冲区内的每个元素。程序执行没有错误。

编辑:如果我从文件中读取大小为char而不是short,则缓冲区的内容(显然更改为char buffer [bufferSize * 2];)与模式OXYO匹配。所以我有(例如)buffer [0]是0X,缓冲区[1]是Y0

1 个答案:

答案 0 :(得分:2)

您的问题似乎与将数据存储到文件中的程序与读取文件的程序之间的字节顺序不匹配完全相同。请记住,手机处理器倾向于使用big-endian表示和笔记本电脑little-endian。

另一个可能的解释是,您的文件可能是由基于Windows的程序以文本模式编写的,该程序将0x0A字节转换为0x0D / 0x0A对,导致内容转移并导致与你观察到的相似的模式。

不是用fread读取文件,而是应该逐字节读取它,并根据为文件格式指定的字节顺序计算值。