private void SaveStringDatabase(StringDatabase strDb, string outputPath) { using (var fs = new FileStream(outputPath, FileMode.Create)) using (var bs = new BinaryStream(fs, strDb.Endian == Endian.Big ? ByteConverter.Big : ByteConverter.Little)) { bs.WriteString("GTST", StringCoding.Raw); bs.WriteInt32(strDb.Strings.Count); bs.WriteInt32(strDb.Version); long lastDataPos = SDB.HeaderSize + (strDb.Strings.Count * sizeof(uint)); var strTable = GetStringDbTable(strDb.Strings); bs.Position = SDB.HeaderSize + (strDb.Strings.Count * sizeof(uint)); strTable.SaveStream(bs); for (int i = 0; i < strDb.Strings.Count; i++) { bs.Position = SDB.HeaderSize + (i * sizeof(uint)); bs.WriteInt32(strTable.GetStringOffset(strDb.Strings[i])); } } }
private void PopulateRowStringsIfNeeded(SpecDB db) { foreach (var row in Rows) { foreach (var dataType in row.ColumnData) { if (dataType is DBString str) { // Lazy load if (!db.StringDatabases.TryGetValue(str.FileName, out StringDatabase strDb)) { var newStrDb = StringDatabase.LoadFromFile(Path.Combine(db.FolderName, str.FileName)); db.StringDatabases.Add(str.FileName, newStrDb); strDb = newStrDb; } str.Value = strDb.Strings[str.StringIndex]; } } } }
public static StringDatabase LoadFromFile(string fileName) { using (var file = File.Open(fileName, FileMode.Open)) using (var bs = new BinaryStream(file)) { if (bs.ReadString(4) != "GTST") { throw new InvalidDataException($"Invalid SDB file '{fileName}'. Magic does not match."); } var strDb = new StringDatabase(); bs.Position = 0x08; strDb.Version = bs.ReadInt32(); strDb.Endian = strDb.Version == 1 ? Endian.Little : Endian.Big; if (strDb.Endian == Endian.Big) { bs.ByteConverter = ByteConverter.Big; } bs.Position = 0x04; int entryCount = bs.ReadInt32(); bs.Position = 0x10; for (int i = 0; i < entryCount; i++) { int strOffset = bs.ReadInt32(); using (var seek = bs.TemporarySeek(0x10 + (entryCount * sizeof(uint) + strOffset), SeekOrigin.Begin)) { seek.Stream.Position += 2; strDb.Strings.Add(seek.Stream.ReadString(StringCoding.ZeroTerminated)); } } return(strDb); } }