From e754e14a03a87eaa868c4497bc8802b1d46ecd0f Mon Sep 17 00:00:00 2001 From: iAmAsval Date: Sun, 11 Oct 2020 23:48:41 +0200 Subject: [PATCH] reverted unsafe readfstring --- FModel/PakReader/ReaderExtensions.cs | 29 +++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/FModel/PakReader/ReaderExtensions.cs b/FModel/PakReader/ReaderExtensions.cs index f8b479c8..a486e2ee 100644 --- a/FModel/PakReader/ReaderExtensions.cs +++ b/FModel/PakReader/ReaderExtensions.cs @@ -9,12 +9,10 @@ namespace PakReader { public static string ReadFString(this BinaryReader reader) { - var SaveNum = reader.ReadInt32(); - - if (SaveNum == 0) return null; - // > 0 for ANSICHAR, < 0 for UCS2CHAR serialization - if (SaveNum < 0) + var SaveNum = reader.ReadInt32(); + bool LoadUCS2Char = SaveNum < 0; + if (LoadUCS2Char) { // If SaveNum cannot be negated due to integer overflow, Ar is corrupted. if (SaveNum == int.MinValue) @@ -23,14 +21,27 @@ namespace PakReader } SaveNum = -SaveNum; + } - var dataBytes = reader.ReadBytes(SaveNum * sizeof(char)); - return Encoding.Unicode.GetString(dataBytes, 0, dataBytes.Length - 1); // 1 byte is removed because of null terminator (\0) + if (SaveNum == 0) return null; + + // 1 byte is removed because of null terminator (\0) + if (LoadUCS2Char) + { + ushort[] data = new ushort[SaveNum]; + for (int i = 0; i < SaveNum; i++) + { + data[i] = reader.ReadUInt16(); + } + unsafe + { + fixed (ushort* dataPtr = &data[0]) + return new string((char*)dataPtr, 0, data.Length - 1); + } } else { - var dataBytes = reader.ReadBytes(SaveNum); - return Encoding.UTF8.GetString(dataBytes, 0, dataBytes.Length - 1); // 1 byte is removed because of null terminator (\0) + return Encoding.UTF8.GetString(reader.ReadBytes(SaveNum).AsSpan(..^1)); } }