如何识别 DICOM 文件? C#

How to recognize DICOM files? C#

我有一个包含文件的文件夹,但并非所有文件都是 DICOM 文件,我需要识别哪个是 DICOM。

我的第一个决定是在检查扩展名的地方创建 foreach 循环:

foreach (var item in fileList.Where(x => x.Extension == ".dcm"))
        {
        }

但不是所有的都有“.dcm”,有些没有,但它们是 DICOM。

我正在使用 fo-dicom nuget 包,但没有在那里找到答案。

我的问题是: 如何检查所有文件的 DICOM?

我知道 Dicom 文件有 128 个空闲字节,最后 4 个字节用于“DICM”,但我如何检查它?

您可以跳过文件的前 128 个字节,读取接下来的 4 个字节,并将它们与“DICM”的 ASCII 码进行比较,例如:

byte[] dicomPrefix    = new byte[4];
byte[] expectedPrefix = "DICM".Select(c => (byte)c).ToArray();

using (var file = File.OpenRead("your filepath here"))
{
    if (file.Length >= 132)
    {
        file.Position = 128; // Skip first 128 bytes.
        file.Read(dicomPrefix, 0, dicomPrefix.Length);

        if (dicomPrefix.SequenceEqual(expectedPrefix))
        {
            // It's a DICOM file.
        }
    }
}

如果您使用的是 fo-dicom,那么您可以使用内置方法 DicomFile.HasValidHeader(filename),即 returns true 或 false。

此方法检查那些魔术字节,但也检查旧版本的 dicom,其中不存在 128 个字节。

我想我找到了解决问题的方法:

foreach (FileInfo f in fileList)
{
    bool isDicom = DicomFile.HasValidHeader(f.FullName);
    if (isDicom)
    {
    }
}