diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/RegistryInterop.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/RegistryInterop.cs index fa7c7095..97bbd4d5 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/RegistryInterop.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/RegistryInterop.cs @@ -6,6 +6,7 @@ using Snap.Hutao.Core.ExceptionService; using Snap.Hutao.Model.Entity; using System.Diagnostics; using System.IO; +using System.Runtime.InteropServices; using System.Text; namespace Snap.Hutao.Service.Game; @@ -31,8 +32,14 @@ internal static class RegistryInterop { if (account is not null) { - string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(account.MihoyoSDK)); - string path = $"HKCU:{GenshinKey[@"HKEY_CURRENT_USER\".Length..]}"; + // 存回注册表的字节需要 '\0' 结尾 + Encoding.UTF8.GetByteCount(account.MihoyoSDK); + byte[] tempBytes = Encoding.UTF8.GetBytes(account.MihoyoSDK); + byte[] target = new byte[tempBytes.Length + 1]; + tempBytes.CopyTo(target, 0); + + string base64 = Convert.ToBase64String(target); + string path = $"HKCU:{GenshinPath}"; string command = $""" $value = [Convert]::FromBase64String('{base64}'); Set-ItemProperty -Path '{path}' -Name '{SdkChineseKey}' -Value $value -Force; @@ -68,13 +75,18 @@ internal static class RegistryInterop /// 在注册表中获取账号信息 /// /// 当前注册表中的信息 - public static string? Get() + public static unsafe string? Get() { object? sdk = Registry.GetValue(GenshinKey, SdkChineseKey, Array.Empty()); if (sdk is byte[] bytes) { - return Encoding.UTF8.GetString(bytes); + fixed (byte* pByte = bytes) + { + // 从注册表获取的字节数组带有 '\0' 结尾,需要舍去 + ReadOnlySpan span = MemoryMarshal.CreateReadOnlySpanFromNullTerminated(pByte); + return Encoding.UTF8.GetString(span); + } } return null;