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);
}
}