BASE64编码和解码

BASE64 编码和解码:
	Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“*”和“-”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
编码
package com.enterise.test;

import java.io.IOException;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Base64Encoder {
	
	public static void main(String[] args){
		Base64Encoder encoder = new Base64Encoder();
		
		String result = encoder.base64();
		System.out.println("result------>"+result);
		System.out.println("length------>"+result.length());
	}
	
	public String base64(){
		BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode("zhouzhou".getBytes());
	}
}
解码
	public void base64Decoder(String result) throws IOException{
		BASE64Decoder decoder = new BASE64Decoder();
		byte[] bs = decoder.decodeBuffer(result);
		String resu = new String(bs);
		
		System.out.println("resu-->"+resu);
}
base64编码的原理:
public String base64_encode( byte[] bytes ) { 
		String[] base64 = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
				"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", 
				"W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", 
				"i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", 
				"u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", 
				"6", "7", "8", "9", "+", "/" };
		
		String encoded = ""; 
		
		int pad_length = 0; 
		
			if ( bytes.length % 3 == 1 ) {
				pad_length = 2; 
			}else if ( bytes.length % 3 == 2 ) {
				pad_length = 1; 
			}
		
			byte[] padded = new byte[ bytes.length + pad_length ]; 
		
			for( int i = 0; i < bytes.length;i++) { 
				padded[ i ] = bytes[ i ]; 
			} 
		
			if ( pad_length == 1 ) { 
				padded[ padded.length - 1 ] = 0; 
			}else if ( pad_length == 2 ) { 
				padded[ padded.length - 1 ] = 0; 
				padded[ padded.length - 2 ] = 0; 
			} 
		
			for( int i = 0; i < padded.length; i += 3 ) { 
				encoded += base64[ ( padded[ i ] >> 2 ) ]; 
				encoded += base64[ ( ( ( padded[ i ] & 3 ) << 4 ) | ( padded[ i + 1 ] >> 4 ) ) ]; 
				encoded += base64[ ( ( ( padded[ i + 1 ] & 15 ) << 2 ) | ( padded[ i + 2 ] >> 6 ) ) ]; 
				encoded += base64[ ( padded[ i + 2 ] & 63 ) ]; 
			} 
		
			encoded = encoded.substring( 0, encoded.length() - pad_length ); 
		
			if ( pad_length == 1 ) {
				encoded += "="; 
			}else if ( pad_length == 2 ) { 
				encoded += "=="; 
			} 
		
		
		return encoded; 
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值