如何从文件中读取8位RAW数据

时间:2019-04-19 18:42:42

标签: c++ file

我的文件中有8位原始数据,代表灰度图像(整数值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)。 我尝试这样做,但所有结果如下:0020 0a00 2000 2000 2000 2000 2000 2000 我不知道出什么问题了,因为二进制文件可以打开吗?

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] << " ";
}

2 个答案:

答案 0 :(得分:0)

因此bufferImmagine是类型uint8_t的数组,在许多平台上uint8_tunsigned char的别名。当您将unsigned char流式传输到std::cout中时,流将其视为字符而不是数字。

如果要将每个字节打印为数字0-255,请将每个字节转换为更宽的整数类型,例如unsigned

std::cout << static_cast<unsigned int>(bufferImmagine[i]) << " ";

答案 1 :(得分:0)

我看到了代码的一些潜在问题:

1)如评论中所述,uint8_t bufferImmagine[height*width];存在问题,因为C ++不支持可变长度数组,因此除非可以将heightwidth编译为-时间常数,最好改用std::vector(或者,如果您对数据结构过敏,则可以使用new运算符分配一个数组,但是如果您不这样做,则可能会泄漏内存)非常小心)。

2)根据widthheight的值,bufferImmagine的大小可能会很大;可能大于可用的堆栈空间量。使用std::vector或在堆上分配的另一个原因。

3)您永远不会检查fread()调用的返回值来查看它是否读取了所有数据。它读取的字节数可能比您要求读取的字节数少(很可能是因为您正在读取的文件不够长),但是如果不检查该值,您将不会知道有什么问题,所以您将如果/何时发生错误,会感到困惑。

4)正如杰克·C(Jack C.)在回答中所提到的,cout可能以ASCII字符而不是整数的形式打印出uint8_t,这不是您想要的。

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;
}