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); }
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"); }
public DCMDataElement ParseTag(ref uint idx, ref DCMDataElement element, BinaryReader reader) { element.gtag = reader.ReadUInt16(); element.etag = reader.ReadUInt16(); //Console.WriteLine("tag"); return(element); }
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)); }
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); } }
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"); } }