c++ - 检查原始文件 C++ 的输出

标签 c++ image binary

您好,我正在读取一个十六进制格式的二进制文件。下面是一个图像文件,是在 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 代表白色区域。另外,我如何计算出多少字节表示该图像中的一个像素。

最佳答案

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

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

关于c++ - 检查原始文件 C++ 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8451145/

相关文章:

c++ - Bazel Link .so 库位于一个完全不同的、非常远程的文件夹中

c++ - #define 跨越整个程序

objective-c - 压缩巨大的png文件以在iphone游戏中使用

jquery - 有没有一种方法可以使用 AJAX/jQuery 上传图像而不使用 Flash 或 iframe?

r - 将二进制字符串转换为二进制或十进制值

c++ - 使用线程时 Windows WriteFile 问题

c++ - 调试时无效句柄异常

html - "space-between"没有flexbox的图片垂直分布

c - 用 C 编写和读取二进制文件

输出的c++ bitset问题