www.pudn.com > WordTip.zip > BasicAuth.java


/* 
 * Created on 2004-10-18 
 * 
 * TODO To change the template for this generated file go to 
 * Window - Preferences - Java - Code Style - Code Templates 
 */ 
package net.hyweb.tool; 
 
/**返回基本认证模式所需要的用户名和密码的base 64编码 
 * 是一个工具类, 只提供一个静态方法并且不能被实例化 
 *  
 * base 64位编码仅仅实现了RFC2045中的一个子功能 
 * 不能支持长度超过76个字符的字符串,也不能支持下划线等 
 * @author Administrator 
 * 
 * TODO To change the template for this generated type comment go to 
 * Window - Preferences - Java - Code Style - Code Templates 
 */ 
class BasicAuth { 
	/** 
	 * 使该类不能被实例化 
	 */ 
	private BasicAuth(){ 
		 
	} 
	 
	/**转换表 
	 * Comment for cvtTable 
	 */ 
	private static byte[] cvtTable = { 
			(byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', 
			(byte)'F', (byte)'G', (byte)'H', (byte)'I', (byte)'J', 
			(byte)'K', (byte)'L', (byte)'M', (byte)'N', (byte)'O', 
			(byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', 
			(byte)'U', (byte)'V', (byte)'W', (byte)'X', (byte)'Y', 
			(byte)'Z',  
			(byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', 
			(byte)'f', (byte)'g', (byte)'h', (byte)'i', (byte)'j', 
			(byte)'k', (byte)'l', (byte)'m', (byte)'n', (byte)'o', 
			(byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', 
			(byte)'u', (byte)'v', (byte)'w', (byte)'x', (byte)'y', 
			(byte)'z',  
			(byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', 
			(byte)'5', (byte)'6', (byte)'7', (byte)'8', (byte)'9', 
			(byte)'+', (byte)'/' 
	}; 
	 
	/**为基本的认证模式提供用户名和密码对的base64编码 
	 * @param name 
	 * @param passwd 
	 * @return 
	 */ 
	static String encode(String name, String passwd){ 
		byte input[] = (name + ":" + passwd).getBytes(); 
		byte[] output = new byte[((input.length / 3) + 1) * 4]; 
		int ridx = 0; 
		int chunk = 0; 
		 
		//以3个字节的步长来遍历整个输入字符串。对于每个3个字节的块, 创建一个24 
		//位的值, 然后从中提取出4个6位的数。使用这些数来得到这人的6位字符的base64编码 
		for(int i = 0; i < input.length; i += 3){ 
			//剩余数据的字节数 
			int left = input.length - i; 
			 
			//要确保至少有3个字节的数据留下 
			if(left > 2){ 
				chunk = (input[i] << 16) | (input[i + 1] <<8) | (input[i + 2]); 
				output[ ridx++ ] = cvtTable[(chunk&0xFC0000) >> 18]; 
				output[ ridx++ ] = cvtTable[(chunk&0x3F000) >> 12]; 
				output[ ridx++ ] = cvtTable[(chunk&0xFC0) >> 6]; 
				output[ ridx++ ] = cvtTable[(chunk&0x3F)]; 
			}else if(left == 2){ 
				chunk = (input[i] << 16) | (input[i + 1] <<8); 
				output[ ridx++ ] = cvtTable[(chunk&0xFC0000) >> 18]; 
				output[ ridx++ ] = cvtTable[(chunk&0x3F000) >> 12]; 
				output[ ridx++ ] = cvtTable[(chunk&0xFC0) >> 6]; 
				output[ ridx++ ] = '='; 
			}else{ 
				chunk = (input[i] << 16) | (input[i + 1] <<8); 
				output[ ridx++ ] = cvtTable[(chunk&0xFC0000) >> 18]; 
				output[ ridx++ ] = cvtTable[(chunk&0x3F000) >> 12]; 
				output[ ridx++ ] = '='; 
				output[ ridx++ ] = '='; 
			} 
		} 
		 
		return new String(output); 
	} 
}