public virtual DCMAbstractType Decode(byte[] data, ref uint idx) { DCMDataElement element = new DCMDataElement(); //vrdecoder = new US(this); //读取TAG element.gtag = vrdecoder.GetUShort(data, ref idx); element.etag = vrdecoder.GetUShort(data, ref idx); if (element.gtag == 0xfffe && element.etag == 0xe000) //处理SQ的三个特殊标记 { DCMDataItem sqitem = new DCMDataItem(this); uint length = vrdecoder.GetUInt(data, ref idx); //不能用GetLength uint offset = idx; while (idx - offset < length) { DCMAbstractType sqelem = Decode(data, ref idx); //递归 if (length == 0xffffffff && sqelem.gtag == 0xfffe && sqelem.etag == 0xe00d) //条目结束标记 { break; } sqitem.items.Add(sqelem); } return(sqitem); } else if (element.gtag == 0xfffe && element.etag == 0xe0dd) //序列结束标记 { element.vr = "UL"; element.length = vrdecoder.GetUInt(data, ref idx); //不能用GetLength return(element); } //查数据字典得到VR,Name,VM element.vr = vrdecoder.GetVR(data, ref idx); DicomDictionaryEntry entry = dictionary.GetEntry(element.gtag, element.etag); if (entry != null) { if (element.vr == "") { element.vr = entry.VR; } element.name = entry.Keyword; element.vm = entry.VM; } else if (element.vr == "" && element.etag == 0) { element.vr = "US"; } //根据得到的VR实例化具体vr类,此处暂时用vrdecode(即US类对象) element.vrparser = vrfactory.GetVR(element.vr); vrdecoder = element.vrparser; //读取值长度 element.length = vrdecoder.GetLength(data, ref idx); //读取值 element.value = vrdecoder.GetValue(data, ref idx, element.length); return(element); }
public virtual List <DCMAbstractType> Decode(byte[] data, ref uint idx) //解码方法 { while (idx < data.Length) { DCMAbstractType item = null; item = syntax.Decode(data, ref idx);//根据传入的传输语法 items.Add(item); } return(items); }
public override byte[] GetValue(byte[] data, ref uint idx, uint length) { uint offset = idx; DCMDataSequence sq = new DCMDataSequence(syntax); while (idx - offset < length) { DCMAbstractType item = syntax.Decode(data, ref idx); if (length == 0xffffffff && item.gtag == 0xfffe && item.etag == 0xe0dd) { break; } else { sq.items.Add((DCMDataItem)item); } } GCHandle handle = GCHandle.Alloc(sq); IntPtr ptr = GCHandle.ToIntPtr(handle); return(BitConverter.GetBytes(ptr.ToInt64())); }