如何使用大写字母和数字对长数字进行编码,以使其更短地输入?

Nic*_*ckG 0 c# encode

有没有办法可以将长数字(例如 12349874529768521)编码为小写字母和数字以减少其长度?这个想法是用户可能在一张纸上有很长的数字。

在我看来,如果有更多可用的符号,则结果数字可以更短。所以我正在寻找类似十六进制的东西,但使用更大的符号空间 AZ 而不仅仅是 AF。

这将用 C# 编写(如果重要的话)

Dyl*_*tie 5

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)