自创一个可逆的字符串长度压缩算法

最近在与友商做数据同步的过程中碰到一个问题:友商的某个字段(类似于uuid,不带中文)长度超过了对应的我们的字段的长度。

自己想出来LZW算法(其他算法压缩出来的长度可能更长),在我们这里并不需要每次都动态生成字符串映射表,只需要提前设定好一个表用于所有的压缩和解压缩过程就行,不过想了一下,这个表会比较庞大,也挺麻烦(陷入思考)…

如果能用一个字符来代表两个字符,那岂不直接能将长度减半?那么如何将两个或多个字符映射为一个字符呢?不妨先将多个字符映射为一个数字试试,然后将该数字转换为 char 字符。
《自创一个可逆的字符串长度压缩算法》
如何将两个字符或多个字符转换为一个数字,并且可以可逆?(简单的将每个字符的ascii值相加当然行不通,不可逆)
使用二进制分区法则可以很好的唯一标识一串字符
《自创一个可逆的字符串长度压缩算法》

假定每个字符的ascii码值不会超过 255,那么则可以让每个字符占 8 位,而后拼接起来转换为十进制就得到了唯一的一个数字。将这个流程反转即是逆转过程。最终转换为一个字符。

这个方法同样也可以应用于唯一标识一个IP地址。

压缩方法 Java 实现

public static String yasuo(String mnw) { 
    StringBuilder sb = new StringBuilder();
    int index = 0;
    for (index = 1; index < mnw.length(); index += 2) { 
        char c1 = mnw.charAt(index - 1);
        char c2 = mnw.charAt(index);
        sb.append((char) (((int) c1 << 8) + (int) c2));
    }
    if (index == mnw.length()) { 
        sb.append(mnw.charAt(index - 1));
    }
    return sb.toString();
}

解码方法 Java 实现

public static String jem(String miw) { 
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < miw.length(); i++) { 
        int c = miw.charAt(i);
        String binaryString = Integer.toBinaryString(c);
        if (binaryString.length() < 8) { 
            sb.append((char) c);
            continue;
        }
        int mnwi1 = Integer.parseInt(binaryString.substring(0, binaryString.length() - 8), 2);
        int mnwi2 = Integer.parseInt(binaryString.substring(binaryString.length() - 8), 2);
        sb.append((char) mnwi1);
        sb.append((char) mnwi2);
    }
    return sb.toString();
}

验证

public static void main(String[] args) { 
    String mnw = "12j3jhk1s-12h3-12j3h712-as2h-23Oas";
    System.out.println("压缩前:" + mnw + ",长度: " + mnw.length());
    String miw = yasuo(mnw);
    System.out.println("压缩后:"+miw +",长度:"+ miw.length());
    String hy = jem(miw);
    System.out.println("还原后:"+hy +",长度:"+ hy.length());
}

《自创一个可逆的字符串长度压缩算法》
验证好使,并且达到了压缩长度的方法。

缺点也很明显

1、压缩后的字符串几乎都为“火星文”,这要是存到库了,别人看了还可能以为是脏数据直接给你删掉了 -_-||
2、并不是对所有字符都能加密,ascii 码值超过一定值时可能会出错
3、java中char占16位,因此最多只能压缩一半的长度。不同语言可能会有所不同
4、不可多次压缩

当然,最后项目里并没有使用这个方法,因为这之后明确了这个字段不会再用于查询友商数据,只用于内部关联,所以就做了简单的字符串截取

    原文作者:CoderLC
    原文地址: https://blog.csdn.net/lcsy000/article/details/108096039
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞