diff --git a/Dalamud/Game/Text/SeStringHandling/SeStringManager.cs b/Dalamud/Game/Text/SeStringHandling/SeStringManager.cs index 958a2b493..ee856f708 100644 --- a/Dalamud/Game/Text/SeStringHandling/SeStringManager.cs +++ b/Dalamud/Game/Text/SeStringHandling/SeStringManager.cs @@ -28,23 +28,17 @@ namespace Dalamud.Game.Text.SeStringHandling /// /// Parse a binary game message into an SeString. /// - /// Binary message payload data in SE's internal format. + /// Pointer to the string's data in memory. + /// Length of the string's data in memory. /// An SeString containing parsed Payload objects for each payload in the data. - public SeString Parse(ReadOnlySpan data) => this.Parse(data.ToArray()); - - /// - /// Parse a binary game message into an SeString. - /// - /// Binary message payload data in SE's internal format. - /// An SeString containing parsed Payload objects for each payload in the data. - public SeString Parse(byte[] bytes) + public unsafe SeString Parse(byte* ptr, int len) { var payloads = new List(); - using (var stream = new MemoryStream(bytes)) + using (var stream = new UnmanagedMemoryStream(ptr, len)) using (var reader = new BinaryReader(stream)) { - while (stream.Position < bytes.Length) + while (stream.Position < len) { var payload = Payload.Decode(reader); if (payload != null) @@ -55,6 +49,26 @@ namespace Dalamud.Game.Text.SeStringHandling return new SeString(payloads); } + /// + /// Parse a binary game message into an SeString. + /// + /// Binary message payload data in SE's internal format. + /// An SeString containing parsed Payload objects for each payload in the data. + public unsafe SeString Parse(ReadOnlySpan data) + { + fixed (byte* ptr = data) + { + return this.Parse(ptr, data.Length); + } + } + + /// + /// Parse a binary game message into an SeString. + /// + /// Binary message payload data in SE's internal format. + /// An SeString containing parsed Payload objects for each payload in the data. + public SeString Parse(byte[] bytes) => this.Parse(new ReadOnlySpan(bytes)); + /// /// Creates an SeString representing an entire Payload chain that can be used to link an item in the chat log. ///