常用编码格式算法
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 实现,不过感觉未来会有发展。
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));
}
运行结果如下: