public static ParamSfoEntry Read(BinaryReader reader, ParamSfo paramSfo, int itemNumber) { const int indexOffset = 0x14; const int indexEntryLength = 0x10; reader.BaseStream.Seek(indexOffset + indexEntryLength * itemNumber, SeekOrigin.Begin); var result = new ParamSfoEntry(); result.KeyOffset = reader.ReadUInt16(); result.ValueFormat = (EntryFormat)reader.ReadUInt16(); result.ValueLength = reader.ReadInt32(); result.ValueMaxLength = reader.ReadInt32(); result.ValueOffset = reader.ReadInt32(); reader.BaseStream.Seek(paramSfo.KeysOffset + result.KeyOffset, SeekOrigin.Begin); byte tmp; var sb = new StringBuilder(32); while ((tmp = reader.ReadByte()) != 0) { sb.Append((char)tmp); } result.Key = sb.ToString(); reader.BaseStream.Seek(paramSfo.ValuesOffset + result.ValueOffset, SeekOrigin.Begin); result.BinaryValue = reader.ReadBytes(result.ValueMaxLength); return(result); }