有没有办法可以将长数字(例如 12349874529768521)编码为小写字母和数字以减少其长度?这个想法是用户可能在一张纸上有很长的数字。
在我看来,如果有更多可用的符号,则结果数字可以更短。所以我正在寻找类似十六进制的东西,但使用更大的符号空间 AZ 而不仅仅是 AF。
这将用 C# 编写(如果重要的话)
Base32 编码旨在产生明确、紧凑、人类可读(且非淫秽!)的表示形式。来自维基百科:
Base32 相对于 Base64 有许多优点:
生成的字符集都是一种大小写,这在使用不区分大小写的文件系统、口语或人类记忆时通常很有用。
结果可以用作文件名,因为它不可能包含“/”符号,这是 Unix 路径分隔符。
可以选择字母表以避免看起来相似的不同符号对,因此可以手动准确地转录字符串。(例如,RFC 4648 符号集省略了数字 1、8 和 0,因为它们可能与字母“I”、“B”和“O”混淆。)
排除填充的结果可以包含在 URL 中,而不对任何字符进行编码。
Base32 还比十六进制/Base16 具有优势:Base32 表示形式占用的空间大约少 20%。(1000 位需要 200 个字符,而 Base16 需要 250 个字符)
Douglas Crockford有关 Base32 编码的原创文章也非常值得一读。
编辑:这里有一些 C# 代码,可以对整数进行基数 N 编码:
class Program {
private const string BINARY = "01";
private const string DECIMAL = "0123456789";
private const string HEX = "0123456789abcdef";
private const string BASE32 = "0123456789abcdefghjkmnpqrstvwxyz";
static string EncodeInt32(string alphabet, int value) {
var sb = new StringBuilder();
while (value > 0) {
sb.Insert(0, alphabet[value % alphabet.Length]);
value = value / alphabet.Length;
}
return sb.ToString();
}
static int DecodeInt32(string alphabet, string value) {
int result = 0;
int b = alphabet.Length;
int pow = 0;
for (var i = value.Length-1; i >= 0; i--) {
result += (int)(Math.Pow(b, pow++)) * alphabet.IndexOf(value[i]);
}
return (result);
}
static void Main(string[] args) {
for (var i = 0; i < 1234567890; i += 1234567) {
Console.WriteLine("{0} {1} {2}", i, EncodeInt32(BASE32, i), DecodeInt32(BASE32, EncodeInt32(BASE32, i)));
}
Console.ReadKey(false);
}
}
Run Code Online (Sandbox Code Playgroud)
显示字符串长度典型减少的示例输出:
1227159598 14j9y1e 1227159598
1228394165 14kfknn 1228394165
1229628732 14mn99w 1229628732
1230863299 14ntyy3 1230863299
1232097866 14q0mja 1232097866
1233332433 14r6a6h 1233332433
1234567000 14sbztr 1234567000
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2273 次 |
| 最近记录: |