【问题标题】:Examining Output of raw files C++检查原始文件 C++ 的输出
【发布时间】:2012-01-17 01:54:07
【问题描述】:

您好,我正在读取一个十六进制格式的二进制文件。它是一个图像文件,下面是在 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++ image binary


    【解决方案1】:

    您的printf() 错误。 %hd 表示short,而fileContents[i]char;在我熟悉的所有现代系统上,这是大小不匹配的。请改用 short 数组,因为您的字节数是像素的两倍。

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

    【讨论】:

    • cout 如何知道一次访问 2 个字节并将其更改为十进制以表示 1 或 0 的像素值
    • @user1084113: cout 会知道,因为您将传递给它的是 short,而不是 charformat() 相信你传递的值的大小,你在撒谎。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-22
      • 2021-11-06
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多