2

我正在尝试使用以下二进制配置读取二进制文件

00 00 00 1A 79 20 83 DB 44 ...

使用以下功能

static BitArray getBitArray(string filename)
{
    FILE *fs = fopen(filename.data(),"r");
    fseek (fs , 0 , SEEK_END);
    unsigned long s = ftell (fs);
    rewind (fs);

    unsigned char *buffer = new unsigned char[s+1];

    fread(buffer,1,s,fs);

    BitArray bArray;
    for(int i=0; i<s; i++)
        bArray.add(buffer[i]);

    delete[] buffer;
    fclose(fs);
    return bArray;
}

哪里BitArray只是我自己的一点操纵类。问题是,对于我上面提到的bin文件,它只读取了前三个0,像这样

00 00 00

即使fseek找到了正确的文件大小。

至于为什么我需要那个字符串 0,是因为00 00 00 1A形成了一个 32 位整数,它恰好小到可以留下三个0x00s。

我怀疑0x00文件开头的 s 字符串被识别为EOF,所以我尝试在文件前面填充一个 char ,但效果不佳。

这可能是什么原因造成的?

4

1 回答 1

9

在 Windows 中,0x1A 又名^Z是文件结束符。您已以文本模式而不是二进制模式打开文件。当您在 Windows 中以文本模式打开文件时,它将一直读取到文件结尾或第一个^Z字符。

传递"rb"fopen而不"r"是以二进制模式打开文件。

于 2012-05-17T08:20:05.263 回答