c#:如何读取文件的部分? (DICOM)
发布时间:2020-12-15 03:47:38 所属栏目:百科 来源:网络整理
导读:我想在C#中读取DICOM文件.我不想做任何事情,我只是现在想知道如何阅读元素,但首先我实际上想知道如何读取标题,看看是否是一个有效的DICOM文件. 它由二进制数据元素组成.前128个字节未使用(设置为零),后跟字符串’DICM’.这之后是标题信息,它被组织成组. 示例
我想在C#中读取DICOM文件.我不想做任何事情,我只是现在想知道如何阅读元素,但首先我实际上想知道如何读取标题,看看是否是一个有效的DICOM文件.
它由二进制数据元素组成.前128个字节未使用(设置为零),后跟字符串’DICM’.这之后是标题信息,它被组织成组. 示例DICOM标题 First 128 bytes: unused DICOM format. Followed by the characters 'D','I','C','M' Followed by extra header information such as: 0002,0000,File Meta Elements Groups Len: 132 0002,0001,File Meta Info Version: 256 0002,0010,Transfer Syntax UID: 1.2.840.10008.1.2.1. 0008,Identifying Group Length: 152 0008,0060,Modality: MR 0008,0070,Manufacturer: MRIcro 在上面的例子中,标题被组织成组.组0002十六进制是包含3个元素的文件元信息组:一个定义组长度,一个存储文件版本,它们存储传输语法. 问题 >如何通过在128字节前导码之后检查’D’,’I’,’C’,’M’字符来读取头文件并验证它是否是DICOM文件? 解决方法
这样的东西应该读取文件,它的基本,不处理所有的情况,但这将是一个起点:
public void ReadFile(string filename) { using (FileStream fs = File.OpenRead(filename)) { fs.Seek(128,SeekOrigin.Begin); if (!(fs.ReadByte() != (byte)'D' || fs.ReadByte() != (byte)'I' || fs.ReadByte() != (byte)'C' || fs.ReadByte() != (byte)'M')) { Console.WriteLine("Not a DCM"); return; } BinaryReader reader = new BinaryReader(fs); ushort g; ushort e; do { g = reader.ReadUInt16(); e = reader.ReadUInt16(); string vr = new string(reader.ReadChars(2)); long length; if (vr.Equals("AE") || vr.Equals("AS") || vr.Equals("AT") || vr.Equals("CS") || vr.Equals("DA") || vr.Equals("DS") || vr.Equals("DT") || vr.Equals("FL") || vr.Equals("FD") || vr.Equals("IS") || vr.Equals("LO") || vr.Equals("PN") || vr.Equals("SH") || vr.Equals("SL") || vr.Equals("SS") || vr.Equals("ST") || vr.Equals("TM") || vr.Equals("UI") || vr.Equals("UL") || vr.Equals("US")) length = reader.ReadUInt16(); else { // Read the reserved byte reader.ReadUInt16(); length = reader.ReadUInt32(); } byte[] val = reader.ReadBytes((int) length); } while (g == 2); fs.Close(); } return ; } 代码实际上并没有考虑到编码数据的传输语法可以在组2元素之后改变,它也不会尝试和读取实际值中的任何内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |