首页 文章

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

提问于
浏览
3

我有一个二进制文件,在这个模式后面填充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的东西吗?当然我检查了缓冲区内的每个元素 . 程序执行没有错误 .

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

1 回答

  • 2

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

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

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

相关问题