Loading...
My Blog 我的工作和学习笔记

JAVA实现Base64编码和解码以及遇到的问题

程序员笔记 2015/12/18 数据编码

Java实现BASE64编解码

BASE64和其他相似的编码算法通常用于转换二进制数据为文本数据,其目的是为了简化存储或传输。更具体地说,BASE64算法主要用于转换二进制数据为ASCII字符串格式。Java语言提供了一个非常好的BASE64算法的实现,即Apache Commons Codec工具包。本文将简要地讲述怎样使用BASE64以及它是怎样工作的。

下面我们用BASE64对字符串进行编码:

import java.io.UnsupportedEncodingException;

import org.apache.commons.codec.binary.Base64;

public class Base64Test {

public static void main(String[] args){

String str = "Hello World";

try{

byte[] encodeBase64 = Base64.encodeBase64(str.getBytes("UTF-8"));

System.out.println("RESULT: " + new String(encodeBase64));

} catch(UnsupportedEncodingException e){

e.printStackTrace();

}

}

}


输出结果为:RESULT: SGVsbG8gV29ybGQ=


上面输出的字符串是“Hello world”字符串的8位二进制值被连接在一起,然后以6位分组。随后每个组都被转换成一个单独的数字并映射到Base64的索引。


一个英文字符占8bit(二进位制信息单位),占1Byte( 字节;8位元组)。
一个汉字用ASCII编码占16bit,占2Byte。


binary dec Base64

010010  18  S

000110  6   G

010101  21  V

101100  44  s

011011  27  b

000110  6   G

111100  60  8

100000  32  g

010101  29  d

110110  54  2

111101  61  9

110010  50  y

011011  27  b

000110  6   G

010000  16  Q


注意:字符串最后加上了“=”,其意思表示字符串编码的结束。


网络传输中遇到的问题

webservice数据交互采用base64编码进行数据传输,在UrlEncode过程中会将“+”转码为“%2b”、“=”转码为“%3d”,webservice接收端如果没对转码后的数据再次处理,而是直接进行base64位解码会导致解码失败,出现乱码。


#源字符串

String string = {"username":"ethan001","roleid":"14","extend":"{\"sex\":\"1\",\"age\":\"23\"}","secret":"6e681327fc9745bbab1be80d5deee9da","realname":"中文测试","password":"123456"}


#经过Base64编码的字符串

String base64String = eyJ1c2VybmFtZSI6ImV0aGFuMDAxIiwicm9sZWlkIjoiMTQiLCJleHRlbmQiOiJ7XCJzZXhcIjpcIjFcIixcImFnZVwiOlwiMjNcIn0iLCJzZWNyZXQiOiI2ZTY4MTMyN2ZjOTc0NWJiYWIxYmU4MGQ1ZGVlZTlkYSIsInJlYWxuYW1lIjoi5Lit5paH5rWL6K+VIiwicGFzc3dvcmQiOiIxMjM0NTYifQ==


#经过UrlEncode编码后的字符串

String base64StringUriEncode = eyJ1c2VybmFtZSI6ImV0aGFuMDAxIiwicm9sZWlkIjoiMTQiLCJleHRlbmQiOiJ7XCJzZXhcIjpcIjFcIixcImFnZVwiOlwiMjNcIn0iLCJzZWNyZXQiOiI2ZTY4MTMyN2ZjOTc0NWJiYWIxYmU4MGQ1ZGVlZTlkYSIsInJlYWxuYW1lIjoi5Lit5paH5rWL6K%2bVIiwicGFzc3dvcmQiOiIxMjM0NTYifQ%3d%3d


#将“+”,“=”的编码替换为正常

String result = "";

result = base64StringUriEncode .replace("%3D", "=");

result = result.replace("%2B", "+");


#Base64位解码

......


在实际开发过程中,还是会遇到一些未知的字符变编码和转换,终级解决办法是将URI编码的字符串,进行解码:

String date = "";

data = URIUtil.decode(data);



参考文档

http://blog.csdn.net/chszs/article/details/17027535

在线进行Base64编码和解码:http://www1.tc711.com/tool/BASE64.htm

在线进行UriEncode编码和解码:http://tool.chinaz.com/Tools/URLEncode.aspx