2017-07-17 67 views
-2
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

二进制数据不是文本。它可以包含*文本,但本身不包含文本。因此,您不能使用文本函数来处理数据。 –

+0

@Someprogrammerdude,我知道。我的主要问题是为什么我能够通过记事本阅读它,但不能通过C++程序以相同的方式阅读? –

+0

.txt文件专门格式化为ASCII,二进制文件可以是任何格式。 – iyop45

回答

6

如果您不清楚file format的使用情况,则无法处理任何二进制文件的内容。

所以在你的情况下,你需要研究DICOM规范。见this

当然,您可能需要使用二进制读取操作,如std::istream::read,std::istream::get等......要明智地使用它们,您需要花费数周时间研究DICOM文件格式。

也许DICOM联盟提供了一些free software库来读取这些文件。看看GDCM(或开发自己的,使用普通parsing技术)。 “

” “ ”

另请参阅关于endiannessserialization

顺便说一下,使用面向文本的函数如getline对于二进制文件没有太大意义(它可以包含空字节和包含10的UTF-8或ASCII-的字节在任何地方)。

+0

我的主要问题是为什么我可以从使用记事本的文本文件读取数据,但不使用C++程序? –

+2

您当然可以使用C++程序读取数据,但您需要花时间(也许几个月)了解文件格式。 –

+0

所以,记事本解析二进制数据,以使其可读? –