欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

常用编码格式算法

程序员文章站 2022-07-14 19:19:58
...

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

运行结果如下:

常用编码格式算法


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

运行结果如下:

常用编码格式算法