2011-12-09 51 views
0

嗨我正在读取格式为十六进制的二进制文件。它是一个图像文件,下面是在Linux上使用hd ... | more命令的前几行代码的简短示例。图像是二进制图形,所以唯一的像素颜色是黑色或白色。它是一个1024×1024的图像,但尺寸为2097152字节检查原始文件的输出C++

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代表白色区域。另外我怎么弄出多少字节代表这个图像中的一个像素。

回答

1

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

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

+0

cout如何知道一次访问2个字节并将它们更改为十进制来表示像素值为1或0 – user1084113

+0

@ user1084113:'cout'会知道,因为您将传递给它一个'short',而不是' char'。 'format()'把你传达的值的大小作为你传递的值的大小,并且你在说谎。 –

0

由于2097152/1024正好是2048,而它又是2 * 1024,所以我会假定每个像素都是2个字节。其他问题可能在printf。我不知道%hd是什么,我会自己使用%02x,并将数据投到int