嗨,我正在读一个以十六进制格式的二进制文件。下面是一个图像文件,它是linux上使用hd .\\more命令的前几行代码的一个简短示例。图像是二值图形,因此唯一的像素颜色要么是黑色,要么是白色。它是一个1024乘1024的图像,但是大小是2097152字节。
00000000 00 00 00 000000.
000dff0 00 00 00 ff 00 ff 00 x.
000dfc00 ff 00 00 00 .
000dfc10 00 00 00 00 00 00 00 00 00
这是我在下面的另一个线程中读取它的代码
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表示白色区域。另外,我如何计算出多少字节代表这个图像中的一个像素。
发布于 2011-12-09 20:33:01
你的printf()是错的。%hd的意思是short,而fileContents[i]是char;在我熟悉的所有现代系统中,这都是一种大小不匹配。使用short数组代替,因为您有两倍于像素的字节。
另外,停止使用printf()并使用std::cout,避免所有类型不匹配的问题。
发布于 2011-12-09 20:24:14
由于2097152/1024正好是2048,这是在第2*1024,我假设每个像素是2个字节。
另一个问题可能在printf中。我不知道%hd是什么,我会亲自使用%02x并将数据转换为int。
https://stackoverflow.com/questions/8451145
复制相似问题