64进制编码转换

由于项目需要把一个ID(数字)压缩成尽可能短字符串,在网上找来好久没有找到合适,

自己动手写一个。

有需要的可以参考一下,也作为自己的一些积累吧!

代码如下:

Java代码  

  1. /**
  2. * 64进制和10进制的转换类
  3. * @author Administrator
  4. *
  5. */
  6. public class compressEncodeing {
  7. final static char[] digits = {
  8. ‘0‘ , ‘1‘ , ‘2‘ , ‘3‘ , ‘4‘ , ‘5‘ ,
  9. ‘6‘ , ‘7‘ , ‘8‘ , ‘9‘ , ‘a‘ , ‘b‘ ,
  10. ‘c‘ , ‘d‘ , ‘e‘ , ‘f‘ , ‘g‘ , ‘h‘ ,
  11. ‘i‘ , ‘j‘ , ‘k‘ , ‘l‘ , ‘m‘ , ‘n‘ ,
  12. ‘o‘ , ‘p‘ , ‘q‘ , ‘r‘ , ‘s‘ , ‘t‘ ,
  13. ‘u‘ , ‘v‘ , ‘w‘ , ‘x‘ , ‘y‘ , ‘z‘ ,
  14. ‘A‘ , ‘B‘ , ‘C‘ , ‘D‘ , ‘E‘ , ‘F‘ ,
  15. ‘G‘ , ‘H‘ , ‘I‘ , ‘J‘ , ‘K‘ , ‘L‘ ,
  16. ‘M‘ , ‘N‘ , ‘O‘ , ‘P‘ , ‘Q‘ , ‘R‘ ,
  17. ‘S‘ , ‘T‘ , ‘U‘ , ‘V‘ , ‘W‘ , ‘X‘ ,
  18. ‘Y‘ , ‘Z‘ , ‘+‘ , ‘/‘  ,
  19. };
  20. /**
  21. * @param args
  22. */
  23. public static void main(String[] args) {
  24. System.out.println(CompressNumber(999999999999999999L,6));
  25. System.out.println(UnCompressNumber(CompressNumber(999999999999999999L,6)));
  26. }
  27. /**
  28. * 把10进制的数字转换成64进制
  29. * @param number
  30. * @param shift
  31. * @return
  32. */
  33. private static String CompressNumber(long number, int shift) {
  34. char[] buf = new char[64];
  35. int charPos = 64;
  36. int radix = 1 << shift;
  37. long mask = radix - 1;
  38. do {
  39. buf[--charPos] = digits[(int)(number & mask)];
  40. number >>>= shift;
  41. } while (number != 0);
  42. return new String(buf, charPos, (64 - charPos));
  43. }
  44. /**
  45. * 把64进制的字符串转换成10进制
  46. * @param decompStr
  47. * @return
  48. */
  49. private static long UnCompressNumber(String decompStr)
  50. {
  51. long result=0;
  52. for (int i =  decompStr.length()-1; i >=0; i--) {
  53. if(i==decompStr.length()-1)
  54. {
  55. result+=getCharIndexNum(decompStr.charAt(i));
  56. continue;
  57. }
  58. for (int j = 0; j < digits.length; j++) {
  59. if(decompStr.charAt(i)==digits[j])
  60. {
  61. result+=((long)j)<<6*(decompStr.length()-1-i);
  62. }
  63. }
  64. }
  65. return result;
  66. }
  67. /**
  68. *
  69. * @param ch
  70. * @return
  71. */
  72. private static long getCharIndexNum(char ch)
  73. {
  74. int num=((int)ch);
  75. if(num>=48&&num<=57)
  76. {
  77. return num-48;
  78. }
  79. else if(num>=97&&num<=122)
  80. {
  81. return num-87;
  82. }else if(num>=65&&num<=90)
  83. {
  84. return num-29;
  85. }else if(num==43)
  86. {
  87. return 62;
  88. }
  89. else if (num == 47)
  90. {
  91. return 63;
  92. }
  93. return 0;
  94. }
  95. }
时间: 2024-10-05 05:32:32

64进制编码转换的相关文章

javascript 10进制和64进制的转换

原文:javascript 10进制和64进制的转换 function string10to64(number) { var chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ-~'.split(''), radix = chars.length, qutient = +number, arr = []; do { mod = qutient % radix; qutient = (qutient - m

C#实现整型数据字任意编码任意进制的转换和逆转换

实现如下: using System; using System.Collections.Generic; using System.Linq; using System.Text;  namespace ConsoleApplication1 {      public class Number     {         public string Characters         {             get;             set;         }        

PHP进制转换[实现2、8、16、36、64进制至10进制相互转换]

自己写了一个PHP进制转换程序,一个类吧,第一次写这个东东,写这个东东,在处理文本文件时能用得到. 可以实现: 10进制转换2.8.16.36.62进制2.8.16.36.62进制转换10进制 有点要注意下,2.8.16进制转换时,使用的是系统的自己的函数. 所以,不管怎么高精度转换值可能大于2147483646. 另外, 32进制低精转换,最大值:2147483646: 32进制高精转换,最大值:77309411327: 64进制高精转换,最大值:133143986175. jinzhi.ph

64进制和10进制转换

class Program { static void Main(string[] args) { long val = 123456789; Console.WriteLine(Parse64Encode(val)); Console.WriteLine(Parse64Decode(Parse64Encode(val))); Console.ReadKey(); } private static char[] rDigits = { '0', '1', '2', '3', '4', '5',

c# 字符串(含有汉字)转化为16进制编码(转)

public static string Str2Hex(string s) { string result = string.Empty; byte[] arrByte = System.Text.Encoding.GetEncoding("GB2312").GetBytes(s); for(int i = 0; i < arrByte.Length; i++) { result += "&#x" + System.Convert.ToString(

C# 10进制与62进制互转 数据大无压力 10进制与72,96进制任意转换

因项目需要把10进制的ID转换成62进制的字符串,分享给别人. 于是在网上搜索了很多算法,但都未能满足需要,项目里的ID是固定算法算出来的18~20位数据的ulong整型. 如:17223472272256398107,509488277152981097. 网上找的算法问题在于,将ulong的值转换62进制的字符串后,再将字符串转换成ulong值时会不准确. 于是各种测试与假象问题所在,最后确定算法确实没有问题,于是开始怀疑数据类型的问题. 果然,原因是使用了Math.Pow(double x

二十四进制编码串转换为32位无符号整数(C语言实现)

typedef int BOOL; #define TRUE 1; #define FALSE 0; #define UINT_MAX 0xffffffff /* maximum unsigned int value */ enum Scale24AsciiVal { sav_aADis = 32, // 小写字母与大写字母ASCII码差值 sav_chIntDis = 48, // 字符'0'ASCII码值 }; static const char scale24[24] = {'0', '1

java 的任意进制间转换

直接上代码: public class Main { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("十进制转换到其它进制:"); int x = 123 ; String str1 = Integer.toHexString(x) ; ///10进制转换成16进制的字符串 System.out.println(str1); String st

Java转义字符和进制的转换

一:转义字符 \r 表示接受键盘输入,相当于按下回车. \n 表示换行. \t  制表符,相当于Table键 \b 退格键,相当于Back Space \'  单引号 \'' 双引号 \\ 表示一个斜跨 注意:换行符就是另起一行,回车符就是回到一行的开头,所以我们平时编写文件的回车符应该确切来说叫做回车换行符 二:进制的转换 整数常量的表现形式:一进制的形式来表示(二进制,八进制,十进制,十六进制) 进制之间的转换: 十进制转为二进制: 将十进制除以2,直到商为0 ,将余数从下上连接起来就是二进