常用编码格式算法

1、base64

Base64 是网络上最常见的用于传输 8Bit 字节码的编码方式之一,Base64 就是一种基于 64 个可打印字符来表示二进制数据的方法。可查看 RFC2045 ~ RFC2049 ,上面有MIME的详细规范。

Base64 编码是从二进制到字符的过程,可用于在 HTTP 环境下传递较长的标识信息。采用 Base64 编码具有不可读性,需要解码后才能阅读。

Base64 由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上 “符号类” 字符(+, /, =),不同的应用场景又分别研制了 Base64 的各种 “变种”。为统一和规范化 Base64 的输出,Base62x 被视为无符号化的改进版本。

引用:Base64百度百科

按照 RFC2045 的定义,Base64 被定义为:Base64 内容传送编码被设计用来把任意序列的 8位字节 描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
常见于邮件、http 加密,截取 http 信息,你就会发现登录操作的用户名、密码字段通过 BASE64 加密的。

BASE64 的加密解密是双向的,可以求反解。

案例实现:

/**
 * Base64 编码、解码测试
 * <br/>
 */
class Base64Test {
    public static void main(String[] args) {

        // 待编码的字符
        String originalStr = "111111";
        System.out.println(String.format("待编码的字符: %s", originalStr));

        /* jdk 实现 */
        System.out.println("=================jdk实现=================");

        // 获取编码器
        Base64.Encoder encoder1 = Base64.getEncoder();

        // 获取解码器
        Base64.Decoder decoder1 = Base64.getDecoder();

        // 编码测试
        byte[] encode1 = encoder1.encode(originalStr.getBytes());
        System.out.println(String.format("编码结果:%s", new String(encode1)));

        // 解码测试
        byte[] decode1 = decoder1.decode(encode1);
        System.out.println(String.format("解码结果:%s", new String(decode1)));

        /* Apache commons-codec 实现 */
        System.out.println("=================Apache commons-codec 实现=================");

        // 编码测试
        byte[] encode2 = org.apache.commons.codec.binary.Base64.encodeBase64(originalStr.getBytes());
        System.out.println(String.format("编码结果:%s", new String(encode2)));

        // 解码测试
        byte[] decode2 = org.apache.commons.codec.binary.Base64.decodeBase64(encode2);
        System.out.println(String.format("解码结果:%s", new String(decode2)));

        /* Spring 实现 */
        System.out.println("------------Spring 实现------------");
        String encodeToString = Base64Utils.encodeToString(originalStr.getBytes());
        System.out.println(String.format("编码结果:%s", encodeToString));
        System.out.println(String.format("解码结果:%s", new String(Base64Utils.decodeFromString(encodeToString))));
    }
}

运行结果如下:

20191023215143.png


2、base62x

Base62x被视为无符号化的改进版本。

码云地址:https://gitee.com/xenxin/Base62x

目前用的人不多,还没有很好的 Java 实现,不过感觉未来会有发展。

相关文章:Base62x比Base64的编码速度更快吗?


3、url编码

url编码 是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送的字符,将数据排行等等)作为URL的一部分或者分离地发给服务器。不管哪种情况,在服务器端的表单输入格式样子象这样:

theName=Ichabod+Crane&gender=male&status=missing& ;headless=yes

当URL地址里包含非西欧字符的字符串时,系统会将这些字符转换成 application/x-www-form-urlencoded 字符串,表单里提交时也是如此,当包含非西欧字符的字符串时,系统也会将这些字符转换成 application/x-www-form-urlencoded 字符串。

URL编码遵循下列规则:

每对name/value由&;符分开;每对来自表单的name/value由=符分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值。任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =,&;,和 % 这些特殊的字符。其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。

相关文章:


Java实现:

/**
    * URLEncoder & URLDecoder 测试
    */
public static void main(String[] args) throws UnsupportedEncodingException {
    /* 测试编码 */
    // 将普通字符串转换成 application/x-www-form-urlencoded 字符串 采用 UTF-8 字符集进行编码
    String encode = URLEncoder.encode("北京大学", "UTF-8");
    System.out.println(String.format("编码结果:%s", encode));

    /* 测试解码 */
    //将 application/x-www-form-urlencoded 字符串转换成普通字符串 采用 UTF-8 字符集进行解码
    String decode = URLDecoder.decode(encode, "UTF-8");
    System.out.println(String.format("解码结果:%s", decode));
}

运行结果如下:

20191023172337.png

posted @ 2019-10-24 11:51  leigq  阅读(581)  评论(0编辑  收藏  举报