diff --git a/PKHeX.Core/MysteryGifts/PGF.cs b/PKHeX.Core/MysteryGifts/PGF.cs index 18fbf170a..77b171bba 100644 --- a/PKHeX.Core/MysteryGifts/PGF.cs +++ b/PKHeX.Core/MysteryGifts/PGF.cs @@ -53,7 +53,7 @@ public sealed class PGF : MysteryGift, IRibbonSetEvent3, IRibbonSetEvent4, ILang public string Nickname { - get => StringConverter.TrimFromFFFF(Encoding.Unicode.GetString(Data, 0x1E, 0x16)); + get => Util.TrimFromFFFF(Encoding.Unicode.GetString(Data, 0x1E, 0x16)); set => Encoding.Unicode.GetBytes(value.PadRight(0xB, (char)0xFFFF)).CopyTo(Data, 0x1E); } @@ -78,7 +78,7 @@ public string Nickname public int IV_SPD { get => Data[0x48]; set => Data[0x48] = (byte)value; } // Unused 0x49 public override string OT_Name { - get => StringConverter.TrimFromFFFF(Encoding.Unicode.GetString(Data, 0x4A, 0x10)); + get => Util.TrimFromFFFF(Encoding.Unicode.GetString(Data, 0x4A, 0x10)); set => Encoding.Unicode.GetBytes(value.PadRight(0x08, (char)0xFFFF)).CopyTo(Data, 0x4A); } public int OTGender { get => Data[0x5A]; set => Data[0x5A] = (byte)value; } @@ -87,7 +87,7 @@ public string Nickname // Unused 0x5D 0x5E 0x5F public override string CardTitle { - get => StringConverter.TrimFromFFFF(Encoding.Unicode.GetString(Data, 0x60, 0x4A)); + get => Util.TrimFromFFFF(Encoding.Unicode.GetString(Data, 0x60, 0x4A)); set => Encoding.Unicode.GetBytes((value + '\uFFFF').PadRight(0x4A / 2, '\0')).CopyTo(Data, 0x60); } diff --git a/PKHeX.Core/PKM/Strings/StringConverter.cs b/PKHeX.Core/PKM/Strings/StringConverter.cs index 0fd50ef78..7f8d10d1e 100644 --- a/PKHeX.Core/PKM/Strings/StringConverter.cs +++ b/PKHeX.Core/PKM/Strings/StringConverter.cs @@ -72,7 +72,7 @@ public static byte[] SetString(string value, int generation, bool jp, bool bigen /// Decoded string. public static string GetString5(byte[] data, int offset, int count) { - return SanitizeString(TrimFromFFFF(Encoding.Unicode.GetString(data, offset, count))); + return SanitizeString(Util.TrimFromFFFF(Encoding.Unicode.GetString(data, offset, count))); } /// Gets the bytes for a Generation 5 string. @@ -292,17 +292,6 @@ internal static string UnSanitizeString(string str, int generation) private static readonly char[] FullToHalf = {'\u2640', '\u2642'}; // ♀♂ - /// - /// Trims a string at the first instance of a 0xFFFF terminator. - /// - /// String to trim. - /// Trimmed string. - public static string TrimFromFFFF(string input) - { - int index = input.IndexOf((char)0xFFFF); - return index < 0 ? input : input.Substring(0, index); - } - public static bool HasEastAsianScriptCharacters(IEnumerable str) => str.Any(c => 0x4E00 <= c && c <= 0x9FFF); } } diff --git a/PKHeX.Core/Saves/SAV5.cs b/PKHeX.Core/Saves/SAV5.cs index ce6c73e09..91e960e5c 100644 --- a/PKHeX.Core/Saves/SAV5.cs +++ b/PKHeX.Core/Saves/SAV5.cs @@ -233,7 +233,7 @@ public override string GetBoxName(int box) { if (box >= BoxCount) return string.Empty; - return StringConverter.TrimFromFFFF(Encoding.Unicode.GetString(Data, PCLayout + (0x28 * box) + 4, 0x28)); + return Util.TrimFromFFFF(Encoding.Unicode.GetString(Data, PCLayout + (0x28 * box) + 4, 0x28)); } public override void SetBoxName(int box, string value) diff --git a/PKHeX.Core/Util/PathUtil.cs b/PKHeX.Core/Util/PathUtil.cs index 7338183cf..fb7d3453d 100644 --- a/PKHeX.Core/Util/PathUtil.cs +++ b/PKHeX.Core/Util/PathUtil.cs @@ -8,11 +8,5 @@ public static string CleanFileName(string fileName) { return string.Concat(fileName.Split(Path.GetInvalidFileNameChars())); } - - public static string TrimFromZero(string input) - { - int index = input.IndexOf('\0'); - return index < 0 ? input : input.Substring(0, index); - } } } diff --git a/PKHeX.Core/Util/Util.cs b/PKHeX.Core/Util/Util.cs index f1615360d..40caf3013 100644 --- a/PKHeX.Core/Util/Util.cs +++ b/PKHeX.Core/Util/Util.cs @@ -1,4 +1,5 @@ using System.Linq; +using System.Runtime.CompilerServices; namespace PKHeX.Core { @@ -106,5 +107,26 @@ public static uint GetHexValue(string value) /// /// Input string to modify public static string ToTitleCase(string str) => string.IsNullOrWhiteSpace(str) ? string.Empty : string.Join(" ", str.Split(' ').Select(TitleCase)); + + /// + /// Trims a string at the first instance of a 0xFFFF terminator. + /// + /// String to trim. + /// Trimmed string. + public static string TrimFromFFFF(string input) => TrimFromFirst(input, (char)0xFFFF); + + /// + /// Trims a string at the first instance of a 0x0000 terminator. + /// + /// String to trim. + /// Trimmed string. + public static string TrimFromZero(string input) => TrimFromFirst(input, '\0'); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static string TrimFromFirst(string input, char c) + { + int index = input.IndexOf(c); + return index < 0 ? input : input.Substring(0, index); + } } }