c#:如何读取文件的部分? (DICOM)

c#:如何读取文件的部分? (DICOM),第1张

概述我想在C#中读取DICOM文件.我不想做任何事情,我只是现在想知道如何阅读元素,但首先我实际上想知道如何读取标题,看看是否是一个有效的DICOM文件. 它由二进制数据元素组成.前128个字节未使用(设置为零),后跟字符串’DICM’.这之后是标题信息,它被组织成组. 示例DICOM标题 First 128 bytes: unused DICOM format.Followed by the c 我想在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: 1320002,0001,file Meta Info Version: 2560002,0010,Transfer Syntax UID: 1.2.840.10008.1.2.1.0008,IDentifying Group Length: 1520008,0060,Modality: MR0008,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元素之后改变,它也不会尝试和读取实际值中的任何内容.

总结

以上是内存溢出为你收集整理的c#:如何读取文件的部分? (DICOM)全部内容,希望文章能够帮你解决c#:如何读取文件的部分? (DICOM)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1260825.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存