MHFCharacterIDConverter/HunterIDHelper.cs
2024-06-14 14:16:02 +08:00

114 lines
3.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Text;
namespace MHFCharacterIDConverter
{
public static class HunterIDHelper
{
public static string UIntIDToInGameID(uint Id)
{
string base32String = MHFBase32Converter.ToBase32((int)Id);
string inGameID = Base32StringToInGameID(base32String);
return inGameID;
}
public static uint InGameIDToUIntID(string inGameID)
{
string base32String = InGameIDToBase32String(inGameID);
uint Id = (uint)MHFBase32Converter.FromBase32(base32String);
return Id;
}
static string Base32StringToInGameID(string str)
{
string result = "";
for (int i = str.Length - 1; i >= 0; i--)
{
result += str[i];
}
while (result.Length < 6)
{
result += "1";
}
return result;
}
static string InGameIDToBase32String(string str)
{
string result = "";
for (int i = 0; i < str.Length; i++)
result = str[i] + result;
List<char> temp = result.ToList();
result = "";
bool bhadfristVal = false;
for (int i = 0; i < temp.Count; i++)
{
if (!bhadfristVal && temp[i] == '1')
continue;
bhadfristVal = true;
result += temp[i];
}
return result;
}
}
public static class MHFBase32Converter
{
private const string Base35Chars = "123456789ABCDEFGHJKLMNPQRTUVWXYZ"; // 35个字符从'1'到'Z'
// 整数转换为35进制字符串自定义的其中'1'代表0
public static string ToBase32(int number)
{
StringBuilder result = new StringBuilder();
while (number > 0)
{
int remainder = number % 32;
result.Insert(0, Base35Chars[remainder]); // 注意这里不需要减1因为直接从'1'开始
number /= 32;
}
// 如果number是0则添加'1'表示
if (result.Length == 0)
{
result.Append(Base35Chars[0]);
}
return result.ToString();
}
// 35进制字符串转换为整数自定义的其中'1'代表0
public static int FromBase32(string base32String)
{
if (string.IsNullOrWhiteSpace(base32String)) throw new ArgumentNullException(nameof(base32String));
int result = 0;
int power = 1;
for (int i = base32String.Length - 1; i >= 0; i--)
{
char currentChar = base32String[i];
int index = Base35Chars.IndexOf(currentChar);
if (index == -1)
{
throw new ArgumentException("Invalid character in base32 string.");
}
// 如果第一个字符是'1'则不需要加1因为'1'代表0
result += (i == 0 && currentChar == '1' ? 0 : index) * power;
power *= 32;
}
return result;
}
}
}