private ExifValue CreateValue() { if (!_reader.CanRead(12)) { return(null); } var tagValue = (ExifTagValue)ReadShort(); var tag = ExifTag.Get(tagValue); var dataType = EnumHelper.Parse(ReadShort(), ExifDataType.Unknown); ExifValue value = null; if (dataType == ExifDataType.Unknown) { return(null); } var numberOfComponents = ReadLong(); if (dataType == ExifDataType.Undefined && numberOfComponents == 0) { numberOfComponents = 4; } if (tag == null) { if (numberOfComponents == 1) { _invalidTags.Add(new ExifTag <byte>(tagValue)); } else { _invalidTags.Add(new ExifTag <byte[]>(tagValue)); } return(null); } var oldIndex = _reader.Index; var length = numberOfComponents * ExifDataTypes.GetSize(dataType); if (length <= 4) { value = CreateValue(tag, dataType, numberOfComponents); } else { var newIndex = _startIndex + ReadLong(); if (_reader.Seek(newIndex)) { if (_reader.CanRead(length)) { value = CreateValue(tag, dataType, numberOfComponents); } } if (value == null) { _invalidTags.Add(tag); } } _reader.Seek(oldIndex + 4); return(value); }
private static uint GetLength(ExifValue value) => GetNumberOfComponents(value) * ExifDataTypes.GetSize(value.DataType);