检查原始文件的输出

Examining Output of raw files C++

本文关键字:输出 文件 原始 检查      更新时间:2023-10-16

你好,我正在阅读十六进制格式的二进制文件。这是一个图像文件,下面是一个简短的例子,前几行代码使用hd…linux上的more命令。该图像是二进制图形,因此唯一的像素颜色不是黑色就是白色。它是一个1024 * 1024的图像但是大小是2097152字节

00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|

000 dfbf0

00 00 00 00 00 00 00 00 00 00 00 00 ff 00 ff 00 |................|

000 dfc00

ff 00 ff 00 ff 00 00 00 00 00 00 00 00 00 00 00 |................|

000 dfc10

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|

这是我用来读取它在另一个线程中找到的代码

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]);

唯一打印出来的是0和没有1。为什么这是我的参数在printf没有正确指定像素大小。我知道图像中有代表白色区域的1。还有,我怎么知道有多少字节代表一个像素在这个图像。

您的printf()是错误的。%hdshort, fileContents[i]char;在我所熟悉的所有现代系统中,这是一个大小不匹配的问题。请使用short数组,因为字节数是像素数的两倍。

同时,停止使用printf()而使用std::cout,避免所有类型不匹配的问题。

由于2097152/1024正好是2048,即2*1024,我假设每个像素是2字节。

另一个问题可能是在printf。我不确定%hd是什么,我会自己使用%02x并将数据转换为int