[C#] c #: come leggere le parti di un file? (DICOM)


Answers

Una rapida ricerca su Google ha portato tre librerie DICOM C #:

Question

Mi piacerebbe leggere un file DICOM in C #. Non voglio fare niente di fantasia, solo che per ora vorrei sapere come leggere gli elementi, ma prima vorrei davvero sapere come leggere l'intestazione per vedere se è un file DICOM valido .

Consiste in elementi di dati binari. I primi 128 byte non sono utilizzati (impostati su zero), seguiti dalla stringa "DICM". Questo è seguito da informazioni di intestazione, che è organizzata in gruppi.

Un'intestazione DICOM di esempio

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,0000, Identifying Group Length: 152
0008,0060, Modality: MR
0008,0070, Manufacturer: MRIcro

Nell'esempio sopra, l'intestazione è organizzata in gruppi. Il gruppo 0002 hex è il gruppo meta information group che contiene 3 elementi: uno definisce la lunghezza del gruppo, uno memorizza la versione del file e il loro memorizza la sintassi del trasferimento.

Domande

  • Come leggere il file di intestazione e verificare se si tratta di un file DICOM controllando i caratteri "D", "I", "C", "M" dopo il preambolo di 128 byte?
  • Come posso continuare ad analizzare il file leggendo le altre parti dei dati?



Tratto da EvilDicom.Helper.DicomReader dalla libreria Evil Dicom :

 public static bool IsValidDicom(BinaryReader r)
    {
        try
        {
            //128 null bytes
            byte[] nullBytes = new byte[128];
            r.Read(nullBytes, 0, 128);
            foreach (byte b in nullBytes)
            {
                if (b != 0x00)
                {
                    //Not valid
                    Console.WriteLine("Missing 128 null bit preamble. Not a valid DICOM file!");
                    return false;
                }
            }
        }
        catch (Exception)
        {

            Console.WriteLine("Could not read 128 null bit preamble. Perhaps file is too short");
            return false;
        }

        try
        {
            //4 DICM characters
            char[] dicm = new char[4];
            r.Read(dicm, 0, 4);
            if (dicm[0] != 'D' || dicm[1] != 'I' || dicm[2] != 'C' || dicm[3] != 'M')
            {
                //Not valid
                Console.WriteLine("Missing characters D I C M in bits 128-131. Not a valid DICOM file!");
                return false;
            }
            return true;

        }
        catch (Exception)
        {

            Console.WriteLine("Could not read DICM letters in bits 128-131.");
            return false;
        }

    }



Solo alcuni pseudologici

Come leggere il file di intestazione e verificare se si tratta di un file DICOM controllando i caratteri "D", "I", "C", "M" dopo il preambolo di 128 byte?

  • Apri come file binario, usando File.OpenRead
  • Cercare la posizione 128 e leggere 4 byte nell'array e confrontarlo con il valore byte [] di nuovo per DICM. È possibile utilizzare ASCIIEncoding.GetBytes () per quello

Come posso continuare ad analizzare il file leggendo le altre parti dei dati?

  • Continua a leggere il file usando Read o ReadByte usando l'handle dell'oggetto FileStream che hai precedentemente
  • Usa lo stesso metodo come sopra per fare il tuo confronto.

Non dimenticare di chiudere e disporre il file.