您好我正在读取以十六进制格式化的二进制文件。下面的图像文件是在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个表示白色区域的事实。另外,我如何计算出这个图像中有多少字节代表一个像素。
答案 0 :(得分:1)
您的printf()
错了。 %hd
表示short
,而fileContents[i]
表示char
;在我熟悉的所有现代系统中,这是一个尺寸不匹配。请使用short
数组,因为您的字节数是像素的两倍。
此外,请停止使用printf()
并使用std::cout
,以避免所有类型不匹配问题。
答案 1 :(得分:0)
由于2097152/1024正好是2048而后者是2 * 1024,我假设每个像素都是2个字节。
另一个问题可能出在printf
。我不确定%hd
是什么,我会自己使用%02x
并将数据投放到int
。