簡體   English   中英

c#將int縮短為區分大小寫的代碼

[英]c# Shorten int into case sensitive code

字母表中有26個字符(abc..yz)和10個數字(0..9)。 如果我們區分大小寫,那么我們可以使用62個字符的詞典。

目前,我們正在根據數據庫中的ID構建文件名的一部分。 這些數字可能會很長,所以我們想縮短它們。 例如,而不是:

file_459123.exe

我們寧願:

file_aB5.exe

有沒有人在C#中有一個方法可以將int轉換為更短的區分大小寫的字符串,並將區分大小寫的字符串轉換回int?

示例(不一定是這種模式):

1 = 1
2 = 2
...
9 = 9
10 = a
11 = b
...
36 = z
37 = A

盡管有Base64參考,但這是一個通用(非優化)解決方案:

// for decimal to hexadecimal conversion use this:
//var digits = "0123456789abcdef".ToCharArray();

var digits = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
             .ToCharArray();

int number = 459123;
string output = "";

do
{
    var digit = digits[(int)(number%digits.Length)];
    output = output.Insert(0, digit.ToString());
    number = (int)number/digits.Length;
}
while (number > 0);

// output is now "1Vrd"

試試Base64

只是將M4Ns解決方案擴展到通用類....

  public class BaseX
    {
        private readonly string _digits;

        public BaseX(string digits)
        {
            _digits = digits;
        }
        public string ToBaseX(int number)
        {           
            var output = "";
            do
            {                
                output = _digits[number % _digits.Length] + output;
                number = number / _digits.Length;
            }
            while (number > 0);
            return output;
        }

        public int FromBaseX(string number)
        {
            return number.Aggregate(0, (a, c) => a*_digits.Length + _digits.IndexOf(c));
        }
    }

然后你可以做...

var x = new BaseX("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
            Console.WriteLine(x.ToBaseX(10));
            Console.WriteLine(x.ToBaseX(459123));
            Console.WriteLine(x.ToBaseX(63));

            Console.WriteLine(x.FromBaseX("1Vrd"));
            Console.WriteLine(x.FromBaseX("A"));

            var bin = new BaseX("01");
            Console.WriteLine(bin.ToBaseX(10));

根據您的情況,您可能希望查看使用Base32,因為受限制的字符集可能更容易閱讀(IE,一些用戶無法輕易區分零和字母o之間的差異)。

你可以在這里這里找到例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM