如何从文件中读取 8 位 RAW 数据
How to read 8bits RAW data from file
我有一个 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_t
是unsigned char
的别名。 当您将unsigned char
流式传输到std::cout
时,流将其视为字符,而不是数字。
如果要将每个字节打印为数字 0-255,请将每个字节转换为更宽的整数类型,如unsigned
:
std::cout << static_cast<unsigned int>(bufferImmagine[i]) << " ";
我看到代码存在一些潜在问题:
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;
}
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何对点云数据进行排序
- 如何从文件中读取 8 位 RAW 数据
- RAW ICMP 套接字:recvfrom() 未接收任何数据
- 使用打印后台处理程序 API 打印"raw"数据
- 从.raw文件读取数据