diff --git a/PKHeX.Core/PKM/PKX.cs b/PKHeX.Core/PKM/PKX.cs
index 29f0c03c9..274f6ca12 100644
--- a/PKHeX.Core/PKM/PKX.cs
+++ b/PKHeX.Core/PKM/PKX.cs
@@ -823,6 +823,31 @@ public static string[] GetPKMExtensions(int MaxGeneration = Generation)
return result.ToArray();
}
+ ///
+ /// Roughly detects the PKM format from the file's extension.
+ ///
+ /// File extension.
+ /// Preference if not a valid extension, usually the highest acceptable format.
+ /// Format hint that the file is.
+ public static int GetPKMFormatFromExtension(string ext, int prefer)
+ {
+ return ext?.Length > 1
+ ? GetPKMFormatFromExtension(ext[ext.Length - 1], prefer)
+ : prefer;
+ }
+ ///
+ /// Roughly detects the PKM format from the file's extension.
+ ///
+ /// Last character of the file's extensio.n
+ /// Preference if not a valid extension, usually the highest acceptable format.
+ /// Format hint that the file is.
+ public static int GetPKMFormatFromExtension(char last, int prefer)
+ {
+ if ('1' <= last && last <= '9')
+ return last - '0';
+ return last == 'x' ? 6 : prefer;
+ }
+
// Extensions
///
/// Gets the Location Name for the
diff --git a/PKHeX.WinForms/Controls/SAV Editor/SlotChangeManager.cs b/PKHeX.WinForms/Controls/SAV Editor/SlotChangeManager.cs
index 8e36c98ce..b6465fbaa 100644
--- a/PKHeX.WinForms/Controls/SAV Editor/SlotChangeManager.cs
+++ b/PKHeX.WinForms/Controls/SAV Editor/SlotChangeManager.cs
@@ -3,7 +3,6 @@
using System.Diagnostics;
using System.Drawing;
using System.IO;
-using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using PKHeX.Core;
@@ -235,8 +234,9 @@ private bool TryLoadFiles(string[] files, DragEventArgs e, bool noEgg)
byte[] data = File.ReadAllBytes(file);
MysteryGift mg = MysteryGift.GetMysteryGift(data, fi.Extension);
- PKM temp = mg?.ConvertToPKM(SAV) ?? PKMConverter.GetPKMfromBytes(data,
- prefer: fi.Extension.Length > 0 ? (fi.Extension.Last() - '0') & 0xF : SAV.Generation);
+ if (fi.Extension.Length > 0 || !int.TryParse(fi.Extension[fi.Extension.Length - 1].ToString(), out var prefer))
+ prefer = SAV.Generation;
+ PKM temp = mg?.ConvertToPKM(SAV) ?? PKMConverter.GetPKMfromBytes(data, prefer: prefer);
PKM pk = PKMConverter.ConvertToType(temp, SAV.PKMType, out string c);
if (pk == null)
diff --git a/PKHeX.WinForms/MainWindow/Main.cs b/PKHeX.WinForms/MainWindow/Main.cs
index 0f67dceca..9cf47e792 100644
--- a/PKHeX.WinForms/MainWindow/Main.cs
+++ b/PKHeX.WinForms/MainWindow/Main.cs
@@ -576,7 +576,7 @@ private bool TryLoadMemoryCard(byte[] input, string path)
}
private bool TryLoadPKM(byte[] input, string ext)
{
- var pk = PKMConverter.GetPKMfromBytes(input, prefer: ext.Length > 0 ? (ext.Last() - '0') & 0xF : C_SAV.SAV.Generation);
+ var pk = PKMConverter.GetPKMfromBytes(input, prefer: PKX.GetPKMFormatFromExtension(ext, C_SAV.SAV.Generation));
if (pk == null)
return false;
diff --git a/PKHeX.WinForms/Subforms/PKM Editors/BatchEditor.cs b/PKHeX.WinForms/Subforms/PKM Editors/BatchEditor.cs
index c0e76d1fc..2625710c1 100644
--- a/PKHeX.WinForms/Subforms/PKM Editors/BatchEditor.cs
+++ b/PKHeX.WinForms/Subforms/PKM Editors/BatchEditor.cs
@@ -276,7 +276,7 @@ private void ProcessFolder(IReadOnlyList files, IList
continue;
}
- int format = fi.Extension.Length > 0 ? (fi.Extension.Last() - '0') & 0xF : SAV.Generation;
+ int format = PKX.GetPKMFormatFromExtension(fi.Extension, SAV.Generation);
byte[] data = File.ReadAllBytes(file);
var pkm = PKMConverter.GetPKMfromBytes(data, prefer: format);
if (ProcessPKM(pkm, Filters, Instructions))
diff --git a/PKHeX.WinForms/Subforms/SAV_Database.cs b/PKHeX.WinForms/Subforms/SAV_Database.cs
index cfdc5e1be..514dbbcef 100644
--- a/PKHeX.WinForms/Subforms/SAV_Database.cs
+++ b/PKHeX.WinForms/Subforms/SAV_Database.cs
@@ -338,7 +338,9 @@ private void LoadDatabase()
{
FileInfo fi = new FileInfo(file);
if (!fi.Extension.Contains(".pk") || !PKX.IsPKM(fi.Length)) return;
- var pk = PKMConverter.GetPKMfromBytes(File.ReadAllBytes(file), file, prefer: (fi.Extension.Last() - '0') & 0xF);
+ var data = File.ReadAllBytes(file);
+ var prefer = PKX.GetPKMFormatFromExtension(fi.Extension, SAV.Generation);
+ var pk = PKMConverter.GetPKMfromBytes(data, file, prefer);
if (pk != null)
dbTemp.Add(pk);
});
diff --git a/Tests/PKHeX.Tests/Legality/LegalityTests.cs b/Tests/PKHeX.Tests/Legality/LegalityTests.cs
index 607ed8618..910e6b5ad 100644
--- a/Tests/PKHeX.Tests/Legality/LegalityTests.cs
+++ b/Tests/PKHeX.Tests/Legality/LegalityTests.cs
@@ -49,7 +49,7 @@ private static void VerifyAll(string folder, string name, bool IsValid)
Assert.IsTrue(PKX.IsPKM(fi.Length), $"Invalid file in {fi.Directory.Name} folder.");
var data = File.ReadAllBytes(file);
- var format = file[file.Length - 1] - '0';
+ var format = PKX.GetPKMFormatFromExtension(file[file.Length - 1], -1);
if (format > 10)
format = 6;
var pkm = PKMConverter.GetPKMfromBytes(data, prefer: format);