Пример #1
0
        public virtual DCMAbstractType Decode(byte[] data, ref uint idx)
        {
            //为节省资源,在构造函数中创建内存流
            MemoryStream ms = new MemoryStream();

            //流赋值
            ms.Write(data, 0, data.Length);
            ms.Position = idx;
            //reader选用
            BinaryReader reader = Select(ms);//此处ppt错误,定义为StreamReader。是困惑源。
            //element初始化
            DCMDataElement element = new DCMDataElement();

            //1.解码tag
            ParseTag(ref idx, ref element, reader);
            //2.解码VR
            ParseVR(ref element, reader);
            //3.解码值长度
            ParseVLength(ref element, reader, ms);
            //4.解码值
            GetValue(ref element, reader);

            //结束
            idx = (uint)ms.Position; //此处ppt错误 ms.Position为Long,不能直接赋值。
            reader.Close();
            ms.Close();              //回收内存流空间
            return(element);
        }
Пример #2
0
        public void LookupDictionary(ref DCMDataElement element)//未将对象引用设置到对象的实例 原为保护方法
        {
            //查数据字典得到VR,Name,VM
            DicomDictionaryEntry entry = dictionary.GetEntry(element.gtag, element.etag);

            if (entry != null)
            {
                if (element.vr == "" || element.vr == null)
                {
                    element.vr = entry.VR;
                }
                element.name = entry.Name;
                element.vm   = entry.VM;
            }
            else if (element.vr == "" && element.etag == 0)
            {
                element.vr = "UL";
            }
            else
            {
                Console.WriteLine("tag不存在");
            }
            //得到VR对象实例
            element.vrparser = vrfactory.GetVR(element.vr);
            //Console.WriteLine("LookUpDic");
        }
Пример #3
0
 public DCMDataElement ParseTag(ref uint idx, ref DCMDataElement element, BinaryReader reader)
 {
     element.gtag = reader.ReadUInt16();
     element.etag = reader.ReadUInt16();
     //Console.WriteLine("tag");
     return(element);
 }
Пример #4
0
 public void GetValue(ref DCMDataElement element, BinaryReader reader)
 {
     if (element.length == 0xffffffff) //undefined length
     {
         element.value = reader.ReadBytes((int)(reader.BaseStream.Length - reader.BaseStream.Position));
     }
     else
     {
         element.value = reader.ReadBytes((int)element.length);
     }
     Console.WriteLine(BitConverter.ToString((byte[])element.value));
 }
Пример #5
0
 public DCMDataElement ParseVR(ref DCMDataElement element, BinaryReader reader)
 {
     if (element.gtag == 0xfffe)
     {
         element.vr = "Undefined";
         return(element);
     }
     else if (isExplicit)
     {
         element.vr = Encoding.Default.GetString(reader.ReadBytes(2));
         LookupDictionary(ref element);
         //Console.WriteLine("vrE");
         return(element);
     }
     else
     {
         LookupDictionary(ref element);
         return(element);
     }
 }
Пример #6
0
        public void ParseVLength(ref DCMDataElement element, BinaryReader reader, MemoryStream ms)
        {
            bool IsSixByte = element.vr == "OB" || element.vr == "OF" || element.vr == "OW" || element.vr == "SQ" || element.vr == "UT" || element.vr == "UN";

            if (!isExplicit || element.gtag == 0xfffe)
            {
                element.length = reader.ReadUInt32();
                //Console.WriteLine("length_I");
            }
            else if (IsSixByte)
            {
                ms.Position   += 2; //skip two bytes
                element.length = reader.ReadUInt32();
                //Console.WriteLine("length_six");
            }
            else
            {
                element.length = reader.ReadUInt16();
                //Console.WriteLine("length_other");
            }
        }