求一个可逆压缩数字长度的算法

行者爷爷 发布于 2020/10/30 16:02
阅读 604
收藏 0

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();
    }
}

求更优更好的可逆压缩数字长度的算法。。。。

求大神指点

加载中
0
Minho
Minho

常见的压缩算法这么多,为啥要自创压缩算法呢?

行者爷爷
行者爷爷
有满足需求的就不自己的做了,:laughing:
0
kakai
kakai

对纯数字类型这么压缩没多大意义,long总是占用8个字节,不会因为你压缩得变短了就不是8个字节了。

Minho
Minho
回复 @行者爷爷 : 二维码能容纳2710个数字,完全都用,你不会是想把N多的数字放到一个二维码里面吧。。。
行者爷爷
行者爷爷
嗯,是的,我的应用场景是这样子的,想把较长的long型变成二维码,然后用扫码枪再把内容识别出来的一个应用场景,二维码的大小有限制 ,大概只有指甲卡大小的样子,如果太小,内容双多,二维码的最复杂度大,制作不方便,识别率会很低
0
轻语大官人
轻语大官人

换成16进制这种呢?也算是压缩了吧。。。

行者爷爷
行者爷爷
算,我整了个64进制的转换,压缩长度不足一半的样子,
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部