Проверка файла DICOM - PullRequest
       7

Проверка файла DICOM

3 голосов
/ 25 января 2011

Я должен выбрать все действительные файлы DICOM из папки. Я могу рекурсивно выбрать все файлы из папки с расширением * .DCM. Но любой файл с * .DCM также подобран, и такой файл не является допустимым файлом DICOM.

Какой самый лучший способ.

Я подумал о том, чтобы прочитать несколько байт файла и проверить.

или

Любой другой метод или любые другие EXE-файлы, которые мы проверяем.

Спасибо, Harsha

Редактировать: Решение проблемы: Я наконец использовал dcmftest.exe для проверки. Надеюсь, я на правильном пути. -Harsha

Ответы [ 6 ]

11 голосов
/ 25 января 2011

Вы хотите распознать файлы DICOM, а не проверять. Есть большая разница. Валидация означает (по крайней мере!), Что присутствуют все теги, необходимые для его класса SOP.

Распознавание легко, поскольку файл DICOM должен содержать текст DICM со смещением 0x80, поэтому теги начинаются со смещения 0x84 файла.

Обратите внимание, что иногда сохраняется только сериализованный набор данных (начиная с группы тегов 8 со смещением файла 0), и их труднее распознать, но они не являются стандартными.

РЕДАКТИРОВАТЬ: В качестве примера рассмотрим архив RAR. Это легко узнать, потому что оно начинается с Rar!. Однако, чтобы быть уверенным, что это действительный архив RAR, необходимо распаковать все файлы и проверить их CRC, и это может быть сделано только самим RAR (и это медленно).

5 голосов
/ 08 ноября 2013

Я знаю, что на этот вопрос уже был дан ответ, но у меня было похожее требование, поэтому я выбрал несколько методов расширения, чтобы сделать именно это.Работает с файлами, FileStreams, MemoryStreams и общими потоками.Читает только конкретные 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();
    }
}

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
4 голосов
/ 28 января 2011

FYI, файлы с расширением .dcm на самом деле не являются законным DICOM, хотя по старым причинам неплохо было бы написать свои программы, чтобы они все равно принимались (но вы не должны помещать 3-символьные расширения файлов в файлы DICOM, экспортируемые приложение). Согласно части стандарта DICOM, касающейся обмена медиа, «расширение имени файла ISO 9660 не должно использоваться». Кроме того, не следует выводить семантику из имен файлов или структуры каталогов, за исключением специального файла DICOMDIR, описанного в частях 10 и 12 стандарта.

Ответ ruslik дает вам правильный способ распознавания файлов DICOM. Если он имеет DICM в указанном месте в преамбуле файла, то это файл DICOM. В противном случае это не так.

3 голосов
/ 25 января 2011

Проверка файла DICOM не так проста, учитывая различные обязательные и дополнительные теги, присутствующие в разных IOD.Я думаю, что для этого лучше использовать существующее решение.Вы можете взглянуть на DCMCHECK из DCMTK , чтобы сделать это.

1 голос
/ 04 июля 2014
<b>For Java User</b>
dcm4che-tool-dcmvalidate
usage: dcmvalidate --iod  [..][..]
Utility to validate DICOM objects according a specified Information Object
Definition.
-
Options:
 -h,--help             display this help and exit
    --iod    path to xml file with Information Object Definition
 -V,--version          output version information and exit
Example:
$ dcmvalidate --iod etc/dcmvalidate/dicomdir-iod.xml DICOMDIR

Validate DICOMDIR against IOD specified in etc/dcmvalidate/dicomdir.xml

<a href="http://jaypthakkar.blogspot.in/2014/06/dcm4che-tool-dcmvalidate.html" rel="nofollow">Click Here for more Reference</a>
0 голосов
/ 15 августа 2014

Помните: проверка преамбулы для «DICM» only проверяет, является ли файл файлом DICOM v3 .

Предыдущие версии DICOM не имели преамбулы.100% действительные файлы DICOM, которые можно просматривать со всеми необходимыми тегами DICOM и т. Д. И которые можно импортировать в узел DICOM, не имеют преамбулы.

Я проверяю в OFFIS, чтобы узнать, лицензированы ливерсия DCMCHECK также имеет это ограничение или нет, но я еще не получил от них ответа.

...