NGINX社区官方微服务训练营,深入了解K8s网络,线上课程+专家答疑,立即加入>>>
寻求一个 可逆压缩数字长度的算法,想过进制转换,发现64进制转出来的效果不佳,压缩长度还不足一半,
下面这个是自己写的,思路是把4个数字,转成二进制,拼接,当成一个字符来存,最大能压缩成原来长度的1/4,效果还是不错的(下面放出代码,大神莫喷呀,在你们面前班门弄斧了,有什么可优化的地方,希望能指出来),没有采用的原因就是,拼接出来的字符,一般都是特殊字符,非正常字符(Ēᘲ刂IJᘙ▃✡),这在系统中也会有很多问题,下图是对应的数字压缩后对印的结果,
下面是源码
public class LongEncode {
public static void main(String[] args) {
long l1 = 2910708422332839812l;
String e = encode(l1);
long l = unEncode(e);
System.out.println("初始值:" + l1);
System.out.println("加密后:" + e);
System.out.println("解密后:" + l);
}
public static String encode(long l){
String s = String.valueOf(l);
char[] chars = s.toCharArray();
StringBuffer sb = new StringBuffer();
if(chars.length%4!=0){
int i = 4 - chars.length%4;
s = append_0(s,chars.length+i);
chars = s.toCharArray();
}
for (int i = 3; i < chars.length; i+=4) {
int _1 = chars[i - 3]-'0';
int _2 = chars[i - 2]-'0';
int _3 = chars[i - 1]-'0';
int _4 = chars[i]-'0';
int i2 = (_1<<12) + (_2<<8) +(_3<<4) +_4;
sb.append(((char)i2));
}
return sb.toString();
}
public static Long unEncode(String s){
char[] chars = s.toCharArray();
StringBuffer sb = new StringBuffer();
for (int i = 0; i <chars.length ; i++) {
int _t = chars[i];
String s1 = Integer.toBinaryString(_t);
s1 = append_0(s1,16);
for (int j = 0; j < 4; j++) {
String su = s1.substring(j * 4, (j + 1) * 4);
Integer integer = Integer.valueOf(su, 2);
sb.append(integer);
}
//System.out.println(s1);
}
return Long.parseLong(sb.toString());
}
public static String append_0(String s,int i){
if(s.length()==i)
return s;
int _i = i -s.length();
StringBuffer sb = new StringBuffer(_i);
for (int j = 0; j < _i; j++) {
sb.append("0");
}
return sb.append(s).toString();
}
}
求更优更好的可逆压缩数字长度的算法。。。。
求大神指点
常见的压缩算法这么多,为啥要自创压缩算法呢?
对纯数字类型这么压缩没多大意义,long总是占用8个字节,不会因为你压缩得变短了就不是8个字节了。
换成16进制这种呢?也算是压缩了吧。。。