src/DotNetCommon.Core/Base36.cs

(完整代码) 1KB

namespace DotNetCommon
{
    using System;
    using System.Collections.Generic;
    using System.Linq;

    /// <summary>
    /// 字符串实现的36进制,使用0-9A-Z表示。它和8进制、10进制、16进制本质上一样(不同于Base64)
    /// </summary>
    public static class Base36
    {
        private const string Base36Characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        /// <summary>
        /// 将给定的数字编码为<see cref="Base36"/>字符串。
        /// </summary>
        /// <param name="input">要编码的数字。</param>
        /// <returns>编码 <paramref name="input"/> 为字符串。</returns>
        public static string Encode(long input)
        {
            Ensure.That<ArgumentException>(input >= 0, "输入不能是负的。");

            var arr = Base36Characters.ToCharArray();
            var result = new Stack<char>();
            while (input != 0)
            {
                result.Push(arr[input % 36]);
                input /= 36;
            }
            return new string(result.ToArray());
        }

        /// <summary>
        /// 将<see cref="Base36"/>编码的字符串解码为长整数。
        /// </summary>
        /// <param name="input">要解码的数字。</param>
        /// <returns>解码 <paramref name="input"/> 为长整数。</returns> 
        public static long Decode(string input)
        {
            Ensure.NotNull(input, nameof(input));

            var reversed = input.ToUpper().Reverse();
            long result = 0;
            var pos = 0;
            foreach (var c in reversed)
            {
                result += Base36Characters.IndexOf(c) * (long)Math.Pow(36, pos);
                pos++;
            }
            return result;
        }
    }
}

24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明

AI 解读

登录后可用,每次 10 积分,解读结果公开显示在下面。

还没有人解读过这个文件。