private ExifValue CreateValue() { if (!_reader.CanRead(12)) { return(null); } ExifTag tag = (ExifTag)ReadShort(); ExifDataType dataType = EnumHelper.Parse(ReadShort(), ExifDataType.Unknown); object value = null; if (dataType == ExifDataType.Unknown) { return(new ExifValue(tag, dataType, value, false)); } uint numberOfComponents = ReadLong(); if (dataType == ExifDataType.Undefined && numberOfComponents == 0) { numberOfComponents = 4; } uint oldIndex = _reader.Index; uint length = numberOfComponents * ExifValue.GetSize(dataType); if (length <= 4) { value = ConvertValue(dataType, length, numberOfComponents); } else { uint newIndex = _startIndex + ReadLong(); if (_reader.Seek(newIndex)) { if (_reader.CanRead(length)) { value = ConvertValue(dataType, length, numberOfComponents); } } if (value == null) { _invalidTags.Add(tag); _reader.Seek(oldIndex + 4); return(null); } } _reader.Seek(oldIndex + 4); bool isArray = value != null && numberOfComponents != 1; return(new ExifValue(tag, dataType, value, isArray)); }
private IExifValue CreateValue() { if (!_reader.CanRead(12)) { return(null); } var tag = (ExifTag)ReadShort(); var dataType = EnumHelper.Parse(ReadShort(), ExifDataType.Unknown); IExifValue value = null; if (dataType == ExifDataType.Unknown) { return(null); } var numberOfComponents = ReadLong(); if (dataType == ExifDataType.Undefined && numberOfComponents == 0) { numberOfComponents = 4; } 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); }