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?
提前致谢!
到目前为止我发现的所有内容都表明 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,输出就越小。请随意添加更多字符,只要它们在您的文件系统中是合法字符即可。