逐字节读取任何文件(不是.bin文件)

Reading any file (not .bin file) byte by byte

本文关键字:文件 不是 bin 读取 任何 字节      更新时间:2023-10-16

我想逐字节(或逐位(读取任何文件(.bin、.txt、.jpg、.zip、.mp3等(,并将其显示在控制台上(以 00100011 这样的格式(。网站上回答了一些问题,但主要是关于.bin文件。我使用哪种文件格式应该无关紧要。例如,当您在文本编辑器中打开.png文件时,您会在屏幕上看到奇怪的字符,例如"∑P®pT™5à*",我认为这些字符是每 8 位文件转换为 ASCII 字母并显示在编辑器上(如果我错了,请纠正我(。

我正在用c ++编写这个程序,到目前为止我尝试过

fstream file("foo.txt", ios_base::binary);

以二进制模式读取文件并获得 8 位块,但这仅适用于.txt文件,它只是像往常一样显示文本文件中的字符。但是甚至不起作用或打开其他文件格式,例如 .png .

我可以得到一些关于如何实现这一点的提示,如果我提供了任何错误的信息,请纠正我。

问题是字节中只有一部分值是可打印的。 例如,值0x03不可打印,但0x42可打印。

我建议您在打印前将变量从 uint8_t 转换为 unsigned int。 类似cout << hex << (unsigned int)(value) << endl;

另外,读取二进制文件时不要使用 charsigned charunsigned char。 使用 uint8_tuint16_tuint32_t

您可能

正在将值分配给"char"数据类型。 您应该始终使用无符号类型("无符号字符"应该足以满足您的情况(,因为二进制文件没有负值,您将能够读取 0-255 而不仅仅是 0-127(文本字符(。 然后,如果您希望它以二进制显示,则可以使用以下命令:

unsigned char c = 251;
char binary[8];
itoa(c, binary, 2);
cout << binary << endl;