From 0bb857876b4c22eaa03c718c5f63b347824a922c Mon Sep 17 00:00:00 2001 From: morkt Date: Sun, 29 Oct 2017 08:12:46 +0400 Subject: [PATCH] (RepiPack): only ASCII characters supposed to be low-cased. --- ArcFormats/Littlewitch/ArcDAT.cs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/ArcFormats/Littlewitch/ArcDAT.cs b/ArcFormats/Littlewitch/ArcDAT.cs index 707c6ad7..4a3cd3fa 100644 --- a/ArcFormats/Littlewitch/ArcDAT.cs +++ b/ArcFormats/Littlewitch/ArcDAT.cs @@ -47,13 +47,12 @@ namespace GameRes.Formats.Littlewitch public byte[] CreateKey () { - var name_bytes = Encodings.cp932.GetBytes (Name.ToLowerInvariant()); + var name_bytes = DatOpener.ToLowerAscii (Name); int name_length = name_bytes.Length; var md5 = new MD5(); Array.Reverse (name_bytes); var key = new byte[1024]; int key_pos = 0; - md5.Initialize(); for (int i = 0; i < 64; ++i) { int name_pos = i % name_length; @@ -209,7 +208,7 @@ namespace GameRes.Formats.Littlewitch { var md5 = new MD5(); FormatCatalog.Instance.ReadFileList (ListFileName, name => { - var name_bytes = Encodings.cp932.GetBytes (name.ToLowerInvariant()); + var name_bytes = ToLowerAscii (name); var hash = md5.ComputeHash (name_bytes); dict[hash] = name; }); @@ -220,6 +219,20 @@ namespace GameRes.Formats.Littlewitch } return dict; } + + internal static byte[] ToLowerAscii (string text) + { + var text_bytes = Encodings.cp932.GetBytes (text); + for (int i = 0; i < text_bytes.Length; ++i) + { + byte c = text_bytes[i]; + if (c >= 'A' && c <= 'Z') + text_bytes[i] += 0x20; + else if (c > 0x7F && c < 0xA1 || c > 0xDF) + ++i; + } + return text_bytes; + } } internal class Md5Comparer : IEqualityComparer