-2

数字 [0,1,2,...8,9] のみで構成される文字列を、数字や文字 [0,1,...9] などの異なる文字セットの別の文字列に再コード化する方法を探しています。 ,a,b,...z] (例として)。結果の文字列は通常、数字のみの文字列よりも短くなります。この方法は可逆的で高速でなければなりません。C# の回答のソース コードを歓迎しますが、一般的なアイデアも歓迎します ;-) 例:

Input:  "1234567890123"
Output: "ar4cju7d"

「ar4cju7d」に適用されたリバース メソッドの出力は、「1234567890123.

4

1 に答える 1

3

入力が常に Int64 の場合は、Base36エンコーディングを確認できます。そして、ここにありますsample implementation

// Edit: Slightly updated on 2011-03-29

/// <summary>
/// A Base36 De- and Encoder
/// </summary>
public static class Base36
{
    private const string CharList = "0123456789abcdefghijklmnopqrstuvwxyz";

    /// <summary>
    /// Encode the given number into a Base36 string
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public static String Encode(long input)
    {
        if (input < 0) throw new ArgumentOutOfRangeException("input", input, "input cannot be negative");

        char[] clistarr = CharList.ToCharArray();
        var result = new Stack<char>();

        while (input != 0)
        {
            result.Push(clistarr[input % 36]);
            input /= 36;
        }

        return new string(result.ToArray());
    }

    /// <summary>
    /// Decode the Base36 Encoded string into a number
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public static Int64 Decode(string input)
    {
        var reversed = input.ToLower().Reverse();
        long result = 0;
        int pos = 0;

        foreach (char c in reversed)
        {
            result += CharList.IndexOf(c) * (long)Math.Pow(36, pos);
            pos++;
        }

        return result;
    }
}

これはあなたの例に適用できます:

long input = 1234567890123;
string encoded = Base36.Encode(input); // yields "fr5hugnf"
long originalInput = Base36.Decode(encoded); // yields 1234567890123
于 2016-01-30T13:48:38.560 に答える