验证DICOM文件

Har*_*sha 4 dicom

我必须从文件夹中选择所有有效的DICOM文件.我可以递归地从文件夹中选择具有*.DCM扩展名的所有文件.但任何带有*.DCM的文件也会被拾取,并且此类文件无效DICOM文件.

什么是最好的方式.

我想到读取文件的几个字节并进行验证.

要么

任何其他方法或我们验证的任何其他EXE.

哈萨,谢谢你

编辑:问题的解决方案:我最终使用dcmftest.exe进行验证.希望我走上正轨.-Harsha

rus*_*lik 11

您想要识别DICOM文件,而不是验证.有很大的不同.验证意味着(至少!)它的SOP类所需的所有标签都存在.

识别很容易,因为DICOM文件必须包含DICM偏移量为0x80的文本,因此标记从文件的偏移量0x84开始.

请注意,有时只存储序列化数据集(从文件偏移0处的标记组8开始),这些更难以识别,但不是标准的.

编辑:举个例子,考虑一个RAR档案.它很容易识别,因为它始于Rar!.但是,为了确保它是一个有效的RAR存档,您必须解压缩所有文件并检查它们的CRC,这只能由RAR本身完成(而且速度很慢).


小智 5

仅供参考,带有 .dcm 扩展名的文件并不是真正合法的 DICOM,尽管出于遗留原因,编写程序以接受它们是个好主意(但您不应该在应用程序导出的 DICOM 文件上放置 3 个字符的文件扩展名)。根据有关媒体交换的 DICOM 标准部分,“不得使用 ISO 9660 文件扩展名”。此外,除了标准第 10 部分和第 12 部分中描述的特殊 DICOMDIR 文件外,不应从文件名或目录结构中推断出语义。

ruslik 的回答为您提供了识别 DICOM 文件的正确方法。如果它在文件序言的指定位置有 DICM,那么它就是一个 DICOM 文件。否则,它不是。


小智 5

我知道已经回答了这个问题,但是我有类似的要求,所以我提出了一些扩展方法来做到这一点。适用于文件,文件流,内存流和通用流。仅读取验证文件类型所需的特定4个字节。效率极高,我能够在几秒钟内浏览成千上万个文件。

C#

public static class Dicom
{
    public static bool IsDicomFile(this Stream s)
    {
        //Create an empty 4 byte array
        byte[] dba = new byte[4];

        //Seek to 0x80
        s.Seek(128, SeekOrigin.Begin);

        //Read the following 4 dba
        s.Read(dba, 0, 4);

        //Compare to 'DICM'
        return dba.SequenceEqual(new byte[4] {68, 73, 67, 77});
    }

    public static bool IsDicomFile(this MemoryStream ms)
    {
        return ((Stream)ms).IsDicomFile();
    }

    public static bool IsDicomFile(this FileStream fs)
    {
        return ((Stream)fs).IsDicomFile();
    }

    public static bool IsDicomFile(this FileInfo fi)
    {
        return fi.OpenRead().IsDicomFile();
    }
}
Run Code Online (Sandbox Code Playgroud)

VB.NET

<Extension()> _
Public Function IsDicomFile(ByVal s As Stream) As Boolean
    'Create an empty 4 byte array
    Dim dba() As Byte = New Byte(3) {}

    'Seek to 0x80
    s.Seek(128, SeekOrigin.Begin)

    'Read the subsequent 4 bytes
    s.Read(dba, 0, 4)

    'Compare to 'DICM'
    Return dba.SequenceEqual(New Byte(3) {68, 73, 67, 77})
End Function

<Extension()> _
Public Function IsDicomFile(ByVal ms As MemoryStream) As Boolean
    Return DirectCast(ms, Stream).IsDicomFile
End Function

<Extension()> _
Public Function IsDicomFile(ByVal fs As FileStream) As Boolean
    Return DirectCast(fs, Stream).IsDicomFile
End Function

<Extension()> _
Public Function IsDicomFile(ByVal fi As FileInfo) As Boolean
    Return fi.OpenRead().IsDicomFile
End Function
Run Code Online (Sandbox Code Playgroud)


Nav*_*een 4

考虑到不同 IOD 中存在不同的强制和可选标签,验证 DICOM 文件并不是一件容易的任务。我认为最好使用现有的解决方案来做到这一点。您可以查看DCMTK 中的 DCMCHECK来执行此操作。