关于java中BASE64解码算法 本帖最后由 not_a_baby 于 2010-10-02 15:12:40 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 也不用看这个过程了。Base64 使用 64 个可显字符来转换二进制数据,可将二进制数据转换为可显字符数据。64 个字符就是 2^6,也就是需要使用 6 个二进制位来表示。二进制数据每个字节是 8 位的。因此向 Base64 转换的过程就是把 8 个字节位都拼在一起,然后再 6 个 6 个拆开来。 Base64很简单呀 就是取4位内存的01 然后用十六进制表示 11110000 = F0 描述有误,base64主要解决的问题是二进制数组与ascii字符串之间的相互转换,描述中提及的第一个、第二个、第三个字符的说法欠妥。手头没装Eclipse,用C#写了一段,经测试是正确的,比较罗嗦的是结尾部分的处理,欢迎高手拍砖private static String BASE64CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";static String base64Encode(byte[] bytes){ String dst = ""; //java编译器会优化字符串相加的操作,此处为可读性考虑,使用字符串相加进行字符连接并不会影响性能 //每3个字节内容用4个字符存储,其位置关系如下 //00000011 11112222 22333333 for (int i = 0; i < bytes.Length; i += 3) { //第一个字节通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符。 dst += BASE64CHARS[bytes[i] >> 2]; if (i + 2 < bytes.Length) { //然后将第一个字节左移4位加上第二个字节右移4位,即获得第二个目标字符。 dst += BASE64CHARS[((bytes[i] & 0x03) << 4) + ((bytes[i + 1] & 0xf0) >> 4)]; //再将第二个字节左移2位加上第三个字节右移6位,获得第三个目标字符。 dst += BASE64CHARS[((bytes[i + 1] & 0x0f) << 2) + ((bytes[i + 2] & 0xc0) >> 6)]; //最后取第三个字符的右6位即获得第四个目标字符。 dst += BASE64CHARS[bytes[i + 2] & 0x3f]; } else if (i + 1 < bytes.Length) { //然后将第一个字节左移4位加上第二个字节右移4位,即获得第二个目标字符。 dst += BASE64CHARS[((bytes[i] & 0x03) << 4) + ((bytes[i + 1] & 0xf0) >> 4)]; //再将第二个字节左移2位加上第三个字节右移6位,获得第三个目标字符。 dst += BASE64CHARS[((bytes[i + 1] & 0x0f) << 2)]; //最后取第三个字符的右6位即获得第四个目标字符。 dst += BASE64CHARS[64]; } else { //然后将第一个字节左移4位加上第二个字节右移4位,即获得第二个目标字符。 dst += BASE64CHARS[((bytes[i] & 0x03) << 4)]; //再将第二个字节左移2位加上第三个字节右移6位,获得第三个目标字符。 dst += BASE64CHARS[64]; //最后取第三个字符的右6位即获得第四个目标字符。 dst += BASE64CHARS[64]; } } return dst;} 问大家个很菜的问题! 新手求助 图书管理 J2SE常用英文 请问:关于布局管理器的问题 我公司使用自行开发的web系统,调用的是java 1.4,如果只安装java1.5或6的话又不能正常使用,能否把1.5或6的版本设置成web系统认定调用的 SplitPane设置左右大小问题 各位好心人 帮一下我 谁帮我改改这段代码,谢谢 一个关于函数内变量初始化的问题 新人发问,最最简单的例程没调通,甚是不爽 关于JAVA java里记录键盘,操作键盘
描述有误,base64主要解决的问题是二进制数组与ascii字符串之间的相互转换,描述中提及的第一个、第二个、第三个字符的说法欠妥。手头没装Eclipse,用C#写了一段,经测试是正确的,比较罗嗦的是结尾部分的处理,欢迎高手拍砖
private static String BASE64CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
static String base64Encode(byte[] bytes)
{
String dst = ""; //java编译器会优化字符串相加的操作,此处为可读性考虑,使用字符串相加进行字符连接并不会影响性能
//每3个字节内容用4个字符存储,其位置关系如下
//00000011 11112222 22333333
for (int i = 0; i < bytes.Length; i += 3)
{
//第一个字节通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符。
dst += BASE64CHARS[bytes[i] >> 2];
if (i + 2 < bytes.Length)
{
//然后将第一个字节左移4位加上第二个字节右移4位,即获得第二个目标字符。
dst += BASE64CHARS[((bytes[i] & 0x03) << 4) + ((bytes[i + 1] & 0xf0) >> 4)];
//再将第二个字节左移2位加上第三个字节右移6位,获得第三个目标字符。
dst += BASE64CHARS[((bytes[i + 1] & 0x0f) << 2) + ((bytes[i + 2] & 0xc0) >> 6)];
//最后取第三个字符的右6位即获得第四个目标字符。
dst += BASE64CHARS[bytes[i + 2] & 0x3f];
}
else if (i + 1 < bytes.Length)
{
//然后将第一个字节左移4位加上第二个字节右移4位,即获得第二个目标字符。
dst += BASE64CHARS[((bytes[i] & 0x03) << 4) + ((bytes[i + 1] & 0xf0) >> 4)];
//再将第二个字节左移2位加上第三个字节右移6位,获得第三个目标字符。
dst += BASE64CHARS[((bytes[i + 1] & 0x0f) << 2)];
//最后取第三个字符的右6位即获得第四个目标字符。
dst += BASE64CHARS[64];
}
else
{
//然后将第一个字节左移4位加上第二个字节右移4位,即获得第二个目标字符。
dst += BASE64CHARS[((bytes[i] & 0x03) << 4)];
//再将第二个字节左移2位加上第三个字节右移6位,获得第三个目标字符。
dst += BASE64CHARS[64];
//最后取第三个字符的右6位即获得第四个目标字符。
dst += BASE64CHARS[64];
}
}
return dst;
}