Base64是一种8位字节代码的编码方式,用于将字节码转换为可见字符的形式进行数据传递。在网络数据传递的时候,并不是所有的字节都可以在在网络中传递。比如对于图片中的二进制流中存在终止符就可能导致数据传输失败;文档数据中的不可见字符虽然可以使用ASCII码表编码表示,但是在邮件传输中是不能够传递不可见的控制字符的。
Base64就是为解决这类问题而产生的,将任意的字节码转化为64个可见字符,然后进行传递和解码。
对于如下的24bit数按照Base64转化为一个4字节数据:
0011 0010 1100 1101 0010 1001
24bit共三个字节数据,按每6位划分得到4组:
001100 101100 110100 101001
每6位前面补两个0得到4字节数据:
00001100 00101100 00110100 00101001
这样每个字节可表示范围为0-63,之后查询码表即可将任意的二进制流转化为可见字符
码表如下:
如下是一个简单的示例代码,使用java中的Base46编码生成一个随机Token
public String getToken(){ // 获取随机数,由于是随机的,所以长度不固定 String random = System.currentTimeMillis() + new Random().nextInt() + ""; try { MessageDigest md = MessageDigest.getInstance("md5"); // 获取不定长随机数的摘要,为一个128位定长任意二进制串 // 由于是任意的二进制位,因此在将该byte[] 转化为String的时候就可能会出现乱码或者在网络传输的时候产生错误 byte token[] = md.digest(random.getBytes()); // 使用前需要导包 sun.misc.BASE64Decoder.jar BASE64Encoder encoder = new BASE64Encoder(); // 将摘要的128位进行Base64编码,以解决乱码 return encoder.encode(token); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } }
生成结果如下:
U7rubDCfG/d1CXTrVY5YTQ==
参考链接:
http://www.cnblogs.com/hongru/archive/2012/01/14/2321397.html
http://www.cnblogs.com/chengxiaohui/articles/3951129.html
http://my.oschina.net/goal/blog/201032#OSC_h2_11