将 UInt64 表示为字符串的最短方法

Leo*_*eon 2 .net c# compression string uint64

我得到一个可能很大的数字(UInt.MaxValue:18446744073709551615)作为正常的base10数字。这个数字最终会成为一个文件名:12345678945768.txt

由于 Windows 上的文件名不仅限于数字,我想将其“压缩”为更短的字符串,但需要确保字符串可以映射回数字。

对于较小的数字:0001365555,十六进制比其他数字短得多。到目前为止我发现的所有内容都表明 Base64 是最短的,但事实并非如此。

到目前为止我已经尝试过这个:

//18446744073709551615 - 20
UInt64 i = UInt64.MaxValue; // 0001365555

//"//////////8=" - 12
string encoded = Convert.ToBase64String(BitConverter.GetBytes(i)); 

//"FFFFFFFFFFFFFFFF" - 16
string hexed = i.ToString("X"); 

//"MTg0NDY3NDQwNzM3MDk1NTE2MTU=" - 28
string utf = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(i.ToString())); 
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来“压缩”整数以类似于十六进制进行转换,但使用 00-zz 而不仅仅是 00-FF?

提前致谢!

vcs*_*nes 5

到目前为止我发现的所有内容都表明 Base64 是最短的,但事实并非如此。

您不想使用 Base64。Base64 编码的文本可以使用该/字符,而 Windows 上的文件名中不允许使用该字符。你需要想出别的办法。

还有什么?

好吧,您可以编写自己的基本转换,也许是这样的:

public static string Convert(ulong number)
{
    var validCharacters = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890!@#$%^&()_-";
    char[] charArray = validCharacters.ToCharArray();
    var buffer = new StringBuilder();
    var quotient = number;
    ulong remainder;
    while (quotient != 0)
    {
        remainder = quotient % (ulong)charArray.LongLength;
        quotient = quotient / (ulong)charArray.LongLength;
        buffer.Insert(0, charArray[remainder].ToString());
    }
    return buffer.ToString();
}
Run Code Online (Sandbox Code Playgroud)

这是一个“base-73”结果, 中的字符越多validCharacters,输出就越小。请随意添加更多字符,只要它们在您的文件系统中是合法字符即可。