using System.Text; using SoulstormReplayReader.Core.Extensions; namespace SoulstormReplayReader.Core.Services; public static class ReplayService { public static void Rename(Stream inStream, Stream outStream, string newName) { var binaryReader = new ExBinaryReader(inStream); var binaryWriter = new BinaryWriter(outStream); // Костыльное нахождение длины старого имени игры binaryReader .Skip(182) // Перемещаюсь на позицию после (GameInfo.FOLDWMAN....) .Skip(binaryReader.ReadInt32() + 20) // DataSdscSize + 24 .Skip(85); var bytesLengthDifference = (newName.Length - binaryReader.ReadInt32()) * 2; binaryReader.Seek(0); binaryWriter.Write(binaryReader.ReadBytes(149 + 4)); // Перемещаюсь к позиции перед размером FOLDINFO binaryWriter.Write(binaryReader.ReadInt32() + bytesLengthDifference); // Переписываю, добавляя разность длинн имен binaryWriter.Write(binaryReader.ReadBytes(21 + 4)); // Иду к позиции перед размером FOLDWMAN var foldWmanSize = binaryReader.ReadInt32(); binaryWriter.Write(foldWmanSize); binaryWriter.Write(binaryReader.ReadBytes(foldWmanSize + 16)); // Телепортируюсь к позиции перед размером DataBase binaryWriter.Write(binaryReader.ReadInt32() + bytesLengthDifference); // Переписываю, добавляя разность длинн имен binaryWriter.Write(binaryReader.ReadBytes(85)); // Первые 85 байт DataBase статичные binaryWriter.Write(newName.Length); // После них идет длина имени игры binaryReader.Skip(binaryReader.ReadInt32() * 2); binaryWriter.Write(Encoding.Unicode.GetBytes(newName)); // И ее имя while (binaryReader.HasBytes) binaryWriter.Write(binaryReader.ReadByte()); binaryWriter.Flush(); } }