逐字节读取任何文件(不是 .bin 文件)
Reading any file (not .bin file) byte by byte
我想逐字节(或逐位)读取任何文件(.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;
此外,在读取二进制文件时不要使用 char
、signed char
或 unsigned char
。使用 uint8_t
、uint16_t
或 uint32_t
。
您可能正在将值分配给 "char" 数据类型。您应该始终使用无符号类型("unsigned char" 应该足以满足您的情况),因为二进制文件没有负值,您将能够读取 0-255 而不仅仅是 0-127(文本字符)。然后,如果你想它以二进制显示,你可以使用:
unsigned char c = 251;
char binary[8];
itoa(c, binary, 2);
cout << binary << endl;
我想逐字节(或逐位)读取任何文件(.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;
此外,在读取二进制文件时不要使用 char
、signed char
或 unsigned char
。使用 uint8_t
、uint16_t
或 uint32_t
。
您可能正在将值分配给 "char" 数据类型。您应该始终使用无符号类型("unsigned char" 应该足以满足您的情况),因为二进制文件没有负值,您将能够读取 0-255 而不仅仅是 0-127(文本字符)。然后,如果你想它以二进制显示,你可以使用:
unsigned char c = 251;
char binary[8];
itoa(c, binary, 2);
cout << binary << endl;