diff --git a/SoulstormReplayReader.Core/Extensions/Extensions.cs b/SoulstormReplayReader.Core/Extensions/Extensions.cs index ed674b5..8eed57d 100644 --- a/SoulstormReplayReader.Core/Extensions/Extensions.cs +++ b/SoulstormReplayReader.Core/Extensions/Extensions.cs @@ -26,20 +26,24 @@ public static class Extensions return span[..i]; } - public static ExBinaryReader NextAsciiStringMustEqual(this ExBinaryReader binReader, string text) + public static ExBinaryReader NextAsciiStringMustEqual(this ExBinaryReader binReader, ReadOnlySpan text) { if (!binReader.IsNextAsciiStringEquals(text)) { - throw new Exception(text + "Нарушение структуры файла. "); + throw new Exception(Encoding.ASCII.GetString(text) + "Нарушение структуры файла. "); } return binReader; } - public static bool IsNextAsciiStringEquals(this ExBinaryReader binReader, string text) + public static bool IsNextAsciiStringEquals(this ExBinaryReader binReader, ReadOnlySpan textSpan) { - Span textSpan = Encoding.ASCII.GetBytes(text); - var nextTextSpan = binReader.ReadBytes(stackalloc byte[text.Length]); + var nextTextSpan = binReader.ReadBytes(stackalloc byte[textSpan.Length]); + + if (textSpan.SequenceEqual(nextTextSpan)) + { + return true; + } return textSpan.Length == nextTextSpan.Length && SpansEqualInvariant(textSpan, nextTextSpan); diff --git a/SoulstormReplayReader.Core/SsReplayReader.cs b/SoulstormReplayReader.Core/SsReplayReader.cs index 8ac8637..3f95e48 100644 --- a/SoulstormReplayReader.Core/SsReplayReader.cs +++ b/SoulstormReplayReader.Core/SsReplayReader.cs @@ -95,14 +95,14 @@ public sealed class SsReplayReader(Stream stream) : IDisposable _binaryReader // relic chunky .Skip(44) - .NextAsciiStringMustEqual("POSTGAMEINFO\0DATADATA") + .NextAsciiStringMustEqual("POSTGAMEINFO\0DATADATA"u8) .SkipInt32(3); Replay.TotalTicks = _binaryReader.ReadInt32(); // Полное игровое время (1 сек = 8 тиков) _binaryReader // relic chunky .Skip(24) - .NextAsciiStringMustEqual("FOLDINFO") + .NextAsciiStringMustEqual("FOLDINFO"u8) .SkipInt32(); Descriptor.FoldInfoStart = _binaryReader.Position; // 153 @@ -110,7 +110,7 @@ public sealed class SsReplayReader(Stream stream) : IDisposable _binaryReader .SkipInt32() - .NextAsciiStringMustEqual("GAMEINFO\0FOLDWMAN") + .NextAsciiStringMustEqual("GAMEINFO\0FOLDWMAN"u8) .SkipInt32(); Descriptor.FoldWmanStart = _binaryReader.Position; // 182 @@ -118,7 +118,7 @@ public sealed class SsReplayReader(Stream stream) : IDisposable _binaryReader .SkipInt32() - .NextAsciiStringMustEqual("DATASDSC") + .NextAsciiStringMustEqual("DATASDSC"u8) .Skip(20); Replay.Map.MaxPlayersCount = _binaryReader.ReadInt32(); @@ -144,7 +144,7 @@ public sealed class SsReplayReader(Stream stream) : IDisposable _binaryReader .SkipInt32(4) - .NextAsciiStringMustEqual("DATABASE") + .NextAsciiStringMustEqual("DATABASE"u8) .SkipInt32(); Descriptor.BeginDataBaseChunkSize = _binaryReader.Position; @@ -252,7 +252,7 @@ public sealed class SsReplayReader(Stream stream) : IDisposable private PlayerModel ReadPlayer() { // В реплеях c ботами нет пустых мест - if (!_binaryReader.IsNextAsciiStringEquals("FOLDGPLY")) + if (!_binaryReader.IsNextAsciiStringEquals("FOLDGPLY"u8)) { _binaryReader.Skip(-8); return PlayerModel.Empty; @@ -263,7 +263,7 @@ public sealed class SsReplayReader(Stream stream) : IDisposable _binaryReader .Skip(12) // int32 version 2; int32 size; int32 strLen 0; - .NextAsciiStringMustEqual("DATAINFO") + .NextAsciiStringMustEqual("DATAINFO"u8) .Skip(12); // int32 version 1; int32 size; int32 strLen 0; player.Name = _binaryReader.ReadNextUnicodeString(); @@ -279,11 +279,11 @@ public sealed class SsReplayReader(Stream stream) : IDisposable if (!_binaryReader.HasBytes) return player; - if (_binaryReader.IsNextAsciiStringEquals("FOLDTCUC")) + if (_binaryReader.IsNextAsciiStringEquals("FOLDTCUC"u8)) { _binaryReader .Skip(12) // int32 version 1; int32 size; int32 strLen 0; - .NextAsciiStringMustEqual("DATALCIN") + .NextAsciiStringMustEqual("DATALCIN"u8) .Skip(4); // int32 version 2; _binaryReader.ReadNextAsciiString(); // описание раскрасок отправителя реплея? @@ -292,7 +292,7 @@ public sealed class SsReplayReader(Stream stream) : IDisposable _binaryReader .Skip(4) // int32 strLen 0; - .NextAsciiStringMustEqual("DATAUNCU") // 42192 + .NextAsciiStringMustEqual("DATAUNCU"u8) // 42192 .Skip(12); // int32 version 1; int32 size; int32 strLen 0; player.ColorScheme = new ColorScheme @@ -338,13 +338,13 @@ public sealed class SsReplayReader(Stream stream) : IDisposable } _binaryReader - .NextAsciiStringMustEqual("FOLDIMAG") + .NextAsciiStringMustEqual("FOLDIMAG"u8) .Skip(8); // int32 version 1; int32 size; playerImage.Name = _binaryReader.ReadNextAsciiString(); _binaryReader - .NextAsciiStringMustEqual("DATAATTR") + .NextAsciiStringMustEqual("DATAATTR"u8) .Skip(16); // int32 version 2; int32 size; 2 * int32 (?) 0; var width = _binaryReader.ReadInt32(); @@ -352,7 +352,7 @@ public sealed class SsReplayReader(Stream stream) : IDisposable _binaryReader .Skip(4) // int32 (?) 1; - .NextAsciiStringMustEqual("DATADATA") + .NextAsciiStringMustEqual("DATADATA"u8) .Skip(12); // int32 version 2; int32 size; int32 (?) 0; playerImage.Init(width, height);