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

How to read 8bits RAW data from file

本文关键字:RAW 数据 读取 文件      更新时间:2023-10-16

我有一个 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)。 我尝试这个,但所有结果都如下所示:0020 0a00 2000 2000 2000 2000 2000 2000 我不知道出了什么问题,fopen 作为二进制文件可以吗?

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

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

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

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

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

1)正如评论中提到的,uint8_t bufferImmagine[height*width];是有问题的,因为C++不支持可变长度数组,所以除非heightwidth可以变成编译时常量,否则最好使用std::vector代替(或者如果你对数据结构过敏,你可以用new运算符分配一个数组, 但是,如果您不是很小心,您可能会泄漏内存)。

2)根据widthheight的值,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;
}