Пример #1
0
 private static uint ReadLength(ReaderState state)
 {
     return(state.IsImplicitVr ? state.Reader.ReadUInt32() : state.Reader.ReadUInt16());
 }
Пример #2
0
        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;
        }
Пример #3
0
        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
            });
        }
Пример #4
0
        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;
        }
Пример #5
0
        private static void ReadUnknown(ReaderState state)
        {
            uint length;
            if (state.ExplicitVr == "OB" || state.ExplicitVr == "OW" ||
                state.ExplicitVr == "UN" || state.ExplicitVr == "SQ")
            {
                state.Reader.ReadBytes(2);
                length = state.Reader.ReadUInt32();
            }
            else
            {
                length = ReadLength(state);
            }

            if (state.ExplicitVr == "SQ")
            {
                var groupId = state.Reader.ReadUInt16();
                var elementId = state.Reader.ReadUInt16();
                ReadElement(state, groupId, elementId);
            }
            else
            {
                state.Reader.ReadBytes((int)length);
            }
        }
Пример #6
0
 private static uint ReadLength(ReaderState state)
 {
     return state.IsImplicitVr ? state.Reader.ReadUInt32() : state.Reader.ReadUInt16();
 }
Пример #7
0
 private static Value[] ReadSeparator(ReaderState state)
 {
     var length = state.Reader.ReadUInt32();
     return new[] { new Value { Long = length } };
 }
Пример #8
0
        private static Value[] ReadItem(ReaderState state)
        {
            Element element;
            string elementName;
            var items = new List<Element>();
            var length = state.Reader.ReadUInt32();
            var endItemPosition = length + state.Reader.BaseStream.Position;

            do
            {
                var groupId = state.Reader.ReadUInt16();
                var elementId = state.Reader.ReadUInt16();

                element = ReadElement(state, groupId, elementId);
                elementName = (element.Tag != null) ? element.Tag.Name : null;
                items.Add(element);

            } while (elementName != "ItemDelimitationItem" &&
                state.Reader.BaseStream.Position < endItemPosition);

            return new[] { new Value { Items = items } };
        }
Пример #9
0
        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
            };
        }
Пример #10
0
        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;
        }
Пример #11
0
        private static Value[] ReadBytes(ReaderState state)
        {
            byte[] data = null;
            if (!state.IsImplicitVr)
            {
                state.Reader.ReadBytes(2);
            }

            var length = state.Reader.ReadUInt32();
            if (length == 0xffffffff) // Check for compressed data.
            {
                throw new IOException("Unable to read compressed data. Use external converter!");
            }
            else
            {
                data = state.Reader.ReadBytes((int)length);
            }

            return new[] { new Value { Bytes = data } };
        }
Пример #12
0
        public static Dictionary<uint, Element> ReadFile(BinaryReader reader)
        {
            var state = new ReaderState()
            {
                UseImplicitVr = false,
                IsImplicitVr = false,
                Reader = reader,
            };

            reader.ReadBytes(128);

            var magicBytes = reader.ReadChars(4);
            var magicText = new string(magicBytes);
            if (magicText != "DICM")
            {
                Logger.Error("Fileformat not recognized!");
                return new Dictionary<uint, Element>();
            }

            var dicomData = new Dictionary<uint, Element>();
            while (reader.BaseStream.Position < reader.BaseStream.Length)
            {
                var groupId = reader.ReadUInt16();
                var elementId = reader.ReadUInt16();
                var combinedId = ElementTag.GetCombinedId(groupId, elementId);
                Logger.Debug("(0x{0:x4}, 0x{1:x4})", groupId, elementId);

                var element = ReadElement(state, groupId, elementId);
                if (element.Tag != null && element.Tag.VR != ValueTypes.Separator)
                {
                    dicomData.Add(combinedId, element);
                }
            }

            return dicomData;
        }