我有一个8位原始数据,表示一个灰度图像(int值为0-255),文件如下:
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 001c 354d 6576 8797
9fa4 a7a4 864b 252e 5973 7673 7b86 7e6d
6164 6c7a 8b98 a2ac b8bd ae96 857f 6d40
1d14 160b 0000 0000 0000 0000 0000 0000
我需要读取它们并打印它们的int值(0-255)。我试了一下,但所有的结果看起来像这样:002000a00 2000 2000 2000我不知道是什么问题,fopen as二进制文件可以吗?
FILE * pFile;
pFile = fopen(inFileName.c_str(), "rb");
if (pFile==NULL){
cerr << "erro" << endl;
}
uint8_t bufferImmagine[height*width];
fread(bufferImmagine,1,height*width,pFile);
fclose (pFile);
for (int i = 0; i < height*width; ++i)
{
cout << bufferImmagine[i] << " ";
}
发布于 2019-04-20 09:37:27
因此,bufferImmagine
是uint8_t
类型的数组,而在许多平台上,uint8_t
是unsigned char
的别名。当您将unsigned char
流式传输到std::cout
中时,流将其视为字符,而不是数字。
如果要将每个字节打印为数字0-255,请将每个字节转换为更广泛的整数类型,如unsigned
std::cout << static_cast<unsigned int>(bufferImmagine[i]) << " ";
发布于 2019-04-20 13:42:33
我在代码中看到了一些潜在的问题:
1)正如评论中提到的,uint8_t bufferImmagine[height*width];
是有问题的,因为C++不支持可变长度数组,所以除非可以将height
和width
转换为编译时常量,否则最好使用std::vector
(或者,如果您对数据结构敏感,可以使用new
运算符分配一个数组,但如果您不非常小心,则有泄漏内存的风险)。
2)根据width
和height
的值,bufferImmagine
的大小可能非常大;可能大于可用堆栈空间量。使用std::vector
或在堆上分配的另一个原因。
3)您永远不会检查fread()
调用的返回值,以查看它是否读取了所有数据。它读取的字节数可能比您要求它读取的字节数少(很可能是因为您正在读取的文件不够长),但是如果不检查这个值,您就不会知道出了什么问题,所以如果/当发生错误时,您会非常困惑。
4)正如Jack C.在他的回答中提到的,cout
可能会打印出uint8_t
的ASCII码字符,而不是整数,这不是您在这里想要的。
5)这不是什么问题,但是如果你希望输出的行对应于文件中的像素行,那么你需要在每个“行”的末尾应用回车符。例如:
int i = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
const unsigned int iVal = bufferImmagine[i];
cout << iVal << " ";
i++;
}
cout << endl;
}
https://stackoverflow.com/questions/55766359
复制相似问题