ifstream fp;
fp.open(path, ios::in | ios::binary); //path is the path of the DICOM file I want to read
fstream output;
output.open("C:\\Users\\Z00\\dump.txt", ios::in | ios::out | ios::trunc | ios::binary);
if (fp.is_open())
{
while (getline(fp, rbuffer))
output << rbuffer;
fp.close();
}
我使用上面的代码以二进制模式从DICOM文件读取到txt文件。
现在如果我使用记事本或任何其他文档查看器打开文本文件,它会显示十六进制编辑器在打开DICOM文件时显示的完全相同的内容。
现在我想操纵文本文档中的数据。所以我尝试将文本文件的内容打印到控制台中,但它打印出完整的乱码。
为什么?
如果我想访问和操作二进制数据,我应该怎么做?
答案 0 :(得分:6)
如果您不熟悉所使用的file format,则无法有意义地处理任何二进制文件的内容。
因此,在您的情况下,您需要研究DICOM规范。请参阅this。
当然,您可能需要使用二进制读取操作,例如std::istream::read,std::istream::get等...要明智地使用它们,您需要花费数周时间研究DICOM文件格式。
也许DICOM联盟提供了一些free software库来读取这些文件。查看GDCM(或使用常见的parsing技术开发您自己的技术)。
另请阅读endianness和serialization。
BTW,使用像getline这样的面向文本的函数对二进制文件没有多大意义(二进制文件可以包含空字节和包含10 -ie\n
的UTF-8或ASCII-在任何地方的字节)