private static Value[] ReadUShort(ReaderState state) { var length = ReadLength(state); var count = length / 2; var output = new Value[count]; for (var i = 0; i < count; i++) { output[i] = new Value { Long = state.Reader.ReadUInt16() }; } return output; }
private static Element ReadElement(ReaderState state, ushort groupId, ushort elementId) { var combinedId = ElementTag.GetCombinedId(groupId, elementId); state.IsImplicitVr = state.UseImplicitVr && (groupId != 0x0002); if (!state.IsImplicitVr && groupId != 0xfffe) // Sequence items are always implicit - hence 0xfffe. { state.ExplicitVr = new string(state.Reader.ReadChars(2)); } // Always use Implicit VR if the tag is recognized in the dictionary. var vr = ValueTypes.Unknown; if (Dictionary.ContainsKey(combinedId)) { var elementTag = Dictionary[combinedId]; vr = elementTag.VR; Logger.Debug(elementTag.Name); } var value = new Value[0]; switch (vr) { case ValueTypes.String: value = ReadString(state); break; case ValueTypes.DoubleString: value = ReadDoubleString(state); break; case ValueTypes.UShort: value = ReadUShort(state); break; case ValueTypes.Bytes: value = ReadBytes(state); break; case ValueTypes.Item: value = ReadItem(state); break; case ValueTypes.Separator: value = ReadSeparator(state); break; default: ReadUnknown(state); break; } // TransferSyntaxUID - See if implicit is specified. We hate implicit because shit cannot always be understood! state.UseImplicitVr = (combinedId == ReverseDictionary["TransferSyntaxUID"]) && (value[0].Text == "1.2.840.10008.1.2"); var tag = Dictionary.ContainsKey(combinedId) ? Dictionary[combinedId] : null; return new Element() { GroupId = groupId, ElementId = elementId, Value = value, Tag = tag }; }
private static Value[] ReadString(ReaderState state) { var length = ReadLength(state); var chars = state.Reader.ReadChars((int)length); var text = new string(chars); var values = text.Split('\\'); var output = new Value[values.Length]; for (var i = 0; i < output.Length; i++) { var value = values[i]; while (value.EndsWith("\0")) { value = value.Substring(0, value.Length - 1); } output[i] = new Value { Text = value }; } return output; }
private static Value[] ReadDoubleString(ReaderState state) { var values = ReadString(state); var output = new Value[values.Length]; for (var i = 0; i < values.Length; i++) { output[i] = new Value { Double = double.Parse(values[i].Text, NumberFormatInfo.InvariantInfo) }; } return output; }