private IEnumerable <FirmwareStringMetadata> ReadStringTable([CanBeNull] StringTableDefinition stringTableDefinition, [NotNull] BinaryReader reader, int startIndex = 0) { if (stringTableDefinition == null) { return(new List <FirmwareStringMetadata>()); } if (reader == null) { throw new ArgumentNullException("reader"); } var charLength = GetCharLength(stringTableDefinition.TwoBytesPerChar); var result = new List <FirmwareStringMetadata>(); { long offsetFrom; long offsetTo; GetOffsets(stringTableDefinition, reader, out offsetFrom, out offsetTo); reader.BaseStream.Seek(offsetFrom, SeekOrigin.Begin); while (reader.BaseStream.Position <= offsetTo) { var offset = reader.BaseStream.Position; var dataLength = 0; while (true) { if (reader.BaseStream.Position <= offsetTo) { var char1 = ReadChar(reader, stringTableDefinition.TwoBytesPerChar); dataLength += charLength; short?char2; if (reader.BaseStream.Position <= offsetTo) { char2 = ReadChar(reader, stringTableDefinition.TwoBytesPerChar); reader.BaseStream.Position -= charLength; } else { break; } if (char1 == 0x00 && char2 != 0x00) { break; } } else { break; } } result.Add(new FirmwareStringMetadata(startIndex + result.Count + 1, offset, dataLength, stringTableDefinition.TwoBytesPerChar)); } } return(result); }
private IEnumerable <FirmwareStringMetadata> ReadStringTable([CanBeNull] StringTableDefinition stringTableDefinition, BlockType blockType, [NotNull] BinaryReader reader) { if (stringTableDefinition == null) { return(new List <FirmwareStringMetadata>()); } if (reader == null) { throw new ArgumentNullException("reader"); } var result = new List <FirmwareStringMetadata>(); { reader.BaseStream.Seek(stringTableDefinition.OffsetFrom, SeekOrigin.Begin); while (reader.BaseStream.Position <= stringTableDefinition.OffsetTo) { var offset = reader.BaseStream.Position; var dataLength = 0; while (true) { if (reader.BaseStream.Position <= stringTableDefinition.OffsetTo) { dataLength++; var byte1 = reader.ReadByte(); byte?byte2; if (reader.BaseStream.Position <= stringTableDefinition.OffsetTo) { byte2 = reader.ReadByte(); reader.BaseStream.Position--; } else { break; } if (byte1 == 0x00 && byte2 != 0x00) { break; } } else { break; } } result.Add(new FirmwareStringMetadata(result.Count + 1, offset, dataLength, blockType)); } } return(result); }