您好,我正在读取一个十六进制格式的二进制文件。下面是一个图像文件,是在 Linux 上使用 hd ... |more 命令的前几行代码的简短示例。该图像是二进制图形,因此唯一的像素颜色是黑色或白色。这是一张 1024 x 1024 的图像,但大小为 2097152 字节
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000dfbf0 00 00 00 00 00 00 00 00 00 00 00 00 ff 00 ff 00 |................|
000dfc00 ff 00 ff 00 ff 00 00 00 00 00 00 00 00 00 00 00 |................|
000dfc10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
这是我在 SO 上的另一个线程中找到的用来读取它的代码
ifstream file (argv[1], ios::in | ios::binary | ios::ate);
ifstream::pos_type fileSize;
char* fileContents;
if(file.is_open())
{
fileSize = file.tellg();
fileContents = new char[fileSize];
file.seekg(0, ios::beg);
if(!file.read(fileContents, fileSize))
{
cout << "fail to read" << endl;
}
file.close();
cout << fileSize << endl;
但是当我运行这个 for 循环时代码有效
for (i=0; i<2097152; i++)
printf("%hd",fileContents[i]);
唯一打印出来的是零,没有 1。为什么这是我在 printf 中的参数没有正确指定像素大小。我知道图像中有 1 代表白色区域。另外,我如何计算出多少字节表示该图像中的一个像素。
của bạn printf()
是错误的。 %hd
表示short
,而fileContents[i]
是一个ký tự
;在我熟悉的所有现代系统上,这是一个大小不匹配。请改用 short
数组,因为字节数是像素数的两倍。
此外,停止使用 printf()
并使用 std::cout
,避免所有类型不匹配问题。
Tôi là một lập trình viên xuất sắc, rất giỏi!