美文网首页
从零写一个Base16编码工具

从零写一个Base16编码工具

作者: 好学人 | 来源:发表于2020-03-14 23:47 被阅读0次

    业务背景

    我的很多资料,都是明文保存在三方的云数据库的,不是没想过加密,问题是加密之后,就无法搜索了,面对大量信息,无法模糊检索可谓硬伤。

    难道真的就没有办法了吗?我坚信一定是有的,只是我还没有发现或想出来而已。

    这不,最近受Base64编码原理的启发,豁然开朗,Base64因为是3个字节合并为一组(24位),再平分成4组,每组6位,因此无法保证字节的双向映射,也因此无法搜索。

    那我实现一个Base16编码,将每个字节一分为二,前4位一组,后4位一组,不就可以保证字节的双向映射,从而实现可搜索编码了嘛?

    说干就干,也就2个方法,满打满算30多行代码,出奇的简单!

    代码实现

    public class Base16 {
    
        /**
         * 对文本进行 base16 编码
         */
        public static String encode(String text) {
            byte[] bytes = text.getBytes(StandardCharsets.UTF_8); // 转换为字节数组
            StringBuilder builder = new StringBuilder();
            for (byte b : bytes) {
                byte b1 = (byte) (b >> 4 & 0b00001111); // 取高4位
                byte b2 = (byte) (b & 0b00001111); // 取低4位
                String s1 = Integer.toHexString(b1);
                String s2 = Integer.toHexString(b2);
                builder.append(s1).append(s2);
            }
            return builder.toString();
        }
    
        /**
         * 将 base16 解码为明文
         */
        public static String decode(String base16) {
            char[] chars = base16.toCharArray();
            byte[] bytes = new byte[chars.length / 2];
            for (int i = 0; i < chars.length; i += 2) {
                String s1 = String.valueOf(chars[i]);
                String s2 = String.valueOf(chars[i + 1]);
                byte b1 = Byte.parseByte(s1, 16);
                byte b2 = Byte.parseByte(s2, 16);
                b1 = (byte) (b1 << 4);
                byte b = (byte) (b1 + b2);
                bytes[i / 2] = b;
            }
            return new String(bytes, StandardCharsets.UTF_8);
        }
    }
    
    

    相关文章

      网友评论

          本文标题:从零写一个Base16编码工具

          本文链接:https://www.haomeiwen.com/subject/bznvqhtx.html