1

我正在尝试编写一个使用 C++ 读取二进制文件的程序。我遇到了一些不寻常的输出,我希望得到一些帮助。

我有一个以这 4 个字节开头的二进制文件:

A1 B2 C3 D4(使用 验证hexdump -C

这是我用来读取这 4 个字节的代码:

#include <iostream> // for reading and writing files
#include <fstream>

using namespace std;

char * buffer;
unsigned int LENGTH = 4;

int main(int argc, char ** argv)
{
    // open the binary file
    ifstream infile ("dump", ios::binary | ios::in);

    // create a buffer
    buffer = new char[LENGTH];

    // read LENGTH bytes from the file
    infile.read(buffer, LENGTH);

    // append the null byte to terminate the string
    buffer[LENGTH] = '\0';

    // loop over the 4 bytes read, and print
    for(int i = 0; i < LENGTH; i++)
    {
       printf("Buffer[%d] is %X\n", i, buffer[i]);
    }

    delete[] buffer;
    infile.close();


    return 0;
}

这个程序给了我这些实际结果:

Buffer[0] is FFFFFFA1
Buffer[1] is FFFFFFB2
Buffer[2] is FFFFFFC3
Buffer[3] is FFFFFFD4

但是,我希望这些结果:

Buffer[0] is A1
Buffer[1] is B2
Buffer[2] is C3
Buffer[3] is D4

谁能向我解释 3 0xFF 字节的来源?它似乎只影响文件的前 4 个字节,接下来的 4 个字节按预期打印出来,没有任何 0xFF 字节前面。

4

2 回答 2

8

char buffer[i]作为变量参数传递时,默认提升。要获得正确的值,请说static_cast<unsigned char>(buffer[i]).

此外,buffer[LENGTH]超出范围,因此行为未定义。

于 2012-09-03T14:44:30.463 回答
5

您无法读取LENGTH内容字节,LENGTH在size 的缓冲区中的偏移处终止LENGTH。这是一个错误的错误。

buffer = new char[LENGTH];

这为您提供了LENGTH字符空间,索引为 0 到LENGTH - 1. 所以这:

buffer[LENGTH] = '\0';

在分配的内存之外写入,调用未定义的行为。

于 2012-09-03T14:42:57.390 回答