我正在尝试编写一个使用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字节。
答案 0 :(得分:8)
char
buffer[i]
作为变量参数传递时默认提升。要获得正确的价值,请说static_cast<unsigned char>(buffer[i])
。
此外,buffer[LENGTH]
超出范围,因而未定义行为。
答案 1 :(得分:5)
您无法在大小为LENGTH
的缓冲区中读取LENGTH
个字节的内容,和在偏移LENGTH
处终止。这是一个错误的错误。
buffer = new char[LENGTH];
这为LENGTH
字符提供了空间,索引为0到LENGTH - 1
。所以这个:
buffer[LENGTH] = '\0';
在分配的内存之外写入,调用未定义的行为。