Scale36.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System;
  2. using System.Collections.Generic;
  3. /// <summary>
  4. /// 36进制换算
  5. /// </summary>
  6. public class Scale36
  7. {
  8. /// <summary>
  9. /// 进制符号字符串
  10. /// </summary>
  11. private static string scString = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ";
  12. /// <summary>
  13. /// 字符集,可以根据编号索引拿到字符
  14. /// </summary>
  15. private static char[] scArray = scString.ToCharArray();
  16. /// <summary>
  17. /// 字符字典,可以根据字符拿到编号索引
  18. /// </summary>
  19. private static Dictionary<char, int> scDic = ToCharDic();
  20. /// <summary>
  21. /// 根据字符串反馈进制数
  22. /// </summary>
  23. public static int Len { get { return scString.Length; } }
  24. /// <summary>
  25. /// 将字符串处理成字符字典
  26. /// </summary>
  27. private static Dictionary<char, int> ToCharDic()
  28. {
  29. Dictionary<char, int> dic = new Dictionary<char, int>();
  30. for (int i = 0; i < scArray.Length; i++)
  31. {
  32. dic.Add(scArray[i], i);
  33. }
  34. return dic;
  35. }
  36. /// <summary>
  37. /// 根据传入的字符符号定义进制,字符符号不能重复,模拟十进制字符串为:0123456789
  38. /// </summary>
  39. public static void SetScale(string scaleString)
  40. {
  41. scString = scaleString;
  42. scArray = scString.ToCharArray();
  43. scDic = ToCharDic();
  44. }
  45. /// <summary>
  46. /// 将Int64转成当前进制字符串
  47. /// </summary>
  48. public static string ToCurr36(long num)
  49. {
  50. string curr = "";
  51. while (num >= Len)
  52. {
  53. curr = scArray[num % Len] + curr;
  54. num = num / Len;
  55. }
  56. curr = scArray[num] + curr;
  57. return curr;
  58. }
  59. /// <summary>
  60. /// 将当前进制字符串转成Int
  61. /// </summary>
  62. public static long ToInt(string curr)
  63. {
  64. double num = 0;
  65. for (int i = 0; i < curr.Length; i++)
  66. {
  67. num += scDic[curr[i]] * Math.Pow(Len, curr.Length - 1 - i);
  68. }
  69. return Convert.ToInt32(num);
  70. }
  71. }