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

时间:2011-12-09 20:11:08

标签: 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个表示白色区域的事实。另外,我如何计算出这个图像中有多少字节代表一个像素。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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