`
txf2004
  • 浏览: 7065297 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

BASE64编码

阅读更多


/**
* 标准Base64编解码,具体规范请参见相关文档。
* @author sunlen
* @version 1.0
*/
public class Base64
{

/** Base64编码表。*/
private static char Base64Code[] =
{
'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','+','/',
};

/** Base64解码表。*/
private static byte Base64Decode[] =
{
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, //注意两个63,为兼容SMP,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,63,-1,63, //“/”和“-”都翻译成63。
52,53,54,55,56,57,58,59,60,61,-1,-1,-1, 0,-1,-1,
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14, //注意两个0:
15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1, //“A”和“=”都翻译成0。
-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1,
};

/**
* 构造方法私有化,防止实例化。
*/
private Base64() {}

/**
* Base64编码。将字节数组中字节3个一组编码成4个可见字符。
* @param b 需要被编码的字节数据。
* @return 编码后的Base64字符串。
*/
public static String encode(byte[] b)
{
int code = 0;

//按实际编码后长度开辟内存,加快速度
StringBuffer sb =new StringBuffer(((b.length-1)/3)<<2+4);

//进行编码
for (int i=0;i<b.length;i++)
{
code|=(b[i]<<(16-i%3*8)) & (0xff<<(16-i%3*8));
if (i%3==2 || i==b.length-1)
{
sb.append(Base64Code[(code & 0xfc0000) >>> 18 ]);
sb.append(Base64Code[(code & 0x3f000) >>> 12 ]);
sb.append(Base64Code[(code & 0xfc0) >>> 6 ]);
sb.append(Base64Code[ code & 0x3f ]);
code=0;
}
}

//对于长度非3的整数倍的字节数组,编码前先补0,编码后结尾处编码用=代替,
//=的个数和短缺的长度一致,以此来标识出数据实际长度
if (b.length%3>0)
{
sb.setCharAt(sb.length()-1,'=');
}
if (b.length%3==1)
{
sb.setCharAt(sb.length()-2,'=');
}
return sb.toString();
}

/**
* Base64解码。
* @param code 用Base64编码的ASCII字符串
* @return 解码后的字节数据
*/
public static byte[] decode(String code)
{

//检查参数合法性
if (code==null)
{
return null;
}
int len = code.length();
if (len%4!=0)
{
throw new IllegalArgumentException(
"Base64 string length must be 4*n");
}
if (code.length()==0)
{
return new byte[0];
}

//统计填充的等号个数
int pad = 0;
if (code.charAt(len-1)=='=')
{
pad++;
}
if (code.charAt(len-2)=='=')
{
pad++;
}

//根据填充等号的个数来计算实际数据长度
int retLen = len/4*3 - pad;

//分配字节数组空间
byte[] ret = new byte [retLen];

//查表解码
char ch1,ch2,ch3,ch4;
int i;
for (i=0;i<len;i+=4)
{
int j=i/4*3;
ch1 = code.charAt(i);
ch2 = code.charAt(i+1);
ch3 = code.charAt(i+2);
ch4 = code.charAt(i+3);
int tmp = (Base64Decode[ch1]<<18)|(Base64Decode[ch2]<<12)
|(Base64Decode[ch3]<<6)|(Base64Decode[ch4]);
ret[j] = (byte) ((tmp&0xff0000) >> 16);
if (i<len-4)
{
ret[j+1] = (byte) ((tmp&0x00ff00) >> 8);
ret[j+2] =(byte) ((tmp&0x0000ff));
}
else
{
if(j+1<retLen)
{
ret[j+1] = (byte) ((tmp&0x00ff00) >> 8);
}
if(j+2<retLen)
{
ret[j+2] = (byte) ((tmp&0x0000ff));
}
}
}
return ret;
}
}

附录:BASE64编码的原理(节选自http://www.vbzx.net/ArticleView/vbzx_Article_View_1199.asp

BASE64编码的原理
  BASE64编码 的原理很简单,其方法是,将输入数据流每次取6 bit(每bit代表1位二进制),不足6bit的补0,这样,每3个8位字节将编码为4个6位字节(3×8 → 4×6);不满4个字节的以“=”填充。其实这4个六位字节 仍然是8位,只不过高两位被设置为0。当一个字节只有6位有效时,它的取值空间为0 到 2的6次方减1 即63,也就是说被转换的Base64编码的每一个编码的取值空间为(0~63)。事实上,0~63之间的ASCII码有许多不可见字符,所以应该再做一个映射,映射表(码表)为

  这样就可以将3个8位字节,转换为4个可见字符。 也就是说,转换后的字符串要比原来的长1/3,扩张率为3:4。 举例说明:
  1、当字符串字符个数为3的倍数时;比如字符串“ABC”,其在计算机内存中的十六进制表示为$41、$42、$43,十进制表示为“65”“66”“67”;二进制表示为
01000001  01000010  01000011
  将这三个二进制数依次取6bit,
  010000/01  0100/0010  01/000011
  就转换成了:
  010000  010100  001001  000011
  将这四个二进制数转换成十六制数为:$10,$14,$9,$3,十进制数位为16,20,9,3。对照上面的码表,分别查找出对应的字符为Q,U,J,D。也是就说字符串“ABC”经过BASE64编码后得出“QUJD”。
  这是最简单的情况,即ASCII码字符数刚好可以被3整除。接着继续讨论余数为2、为1的情况。
  2、当余数为2时,比如字符串“ce”,其在内存中十六进制表示为$63,$65;十进制表示表示99,101;二进制表示为
  01100011 01100101 依次取6bit 011000/11 0110/0101
  这时,第3个字符不足6位,在后面补零,也就是0101变成010100。转换结果为
  011000 110110 010100
  这3个二进制数转换成十六制数为$18,$36,$14;十进制数位为24,54,20。对照码表得出结果“Y2U”。编码后的字符个数不足4位,用“=”填充,最后编码得出“Y2U=”。
  3、当余数为1时,比如字符串“{”,其在内存中的十六进制表示为$7B,十进制为123,二进制位表示为
  01111011 依次取6bit 011110/11 
  补0后为 011110/110000  转换结果为011110和110000
  这两个二进制数转换成十六进制数为$1E,$30,十进制数为30,48。对照码表得出结果为“ew”,补上“=”,最后编码得出“ew= =”。
  解码也很简单,是编码的逆过程,即将每个字符对照码表换算成6bit的二进制数,然后重组起来,按8位进行截取,得出原码。

分享到:
评论

相关推荐

    labview 图片缩放 base64编码base64解码

    在这个特定的场景中,我们关注的是如何在LabVIEW中处理图片,包括图片的缩放、Base64编码和解码。 1. **图片缩放**: 在LabVIEW中,你可以使用图像处理库来实现图片的缩放功能。这个库提供了各种图像操作函数,...

    易语言汇编base64编码

    1. **Base64解析**:接收Base64编码的字符串,根据Base64字符集将每个字符转换回6位的二进制数。 2. **组合二进制数据**:将4个6位的二进制数组合成3个8位的字节,注意需要处理末尾的填充字符"="。 3. **数据恢复*...

    Base64编码解码工具

    Base64编码基于64个字符的字符集,这个字符集包括26个小写字母、26个大写字母、10个数字以及两个特殊字符“+”和“/”。每个64个字符代表一个6位的二进制数,这意味着每个64字符可以表示2^6 = 64种不同的值。由于...

    Base64编码解码工具成品+源码

    Base64编码是一种在网络上传输二进制数据的文本编码方式,主要应用于电子邮件、网页编码等领域,确保数据在传输过程中的安全性和可读性。它将任意二进制数据转换成可打印的ASCII字符,避免了非ASCII字符在传输过程中...

    文件转换为Base64编码

    Base64编码是一种在互联网上常见的数据编码方式,主要用于在不支持二进制传输的环境(如邮件系统)中传输二进制数据。它将任意的二进制数据转化为可打印的ASCII字符序列,以便在文本格式下进行传输和存储。这种编码...

    C语言base64编码解码库

    在IT领域,Base64是一种常见的编码方式,用于将二进制数据转化为可以在电子邮件系统、文本文件等中安全传输的ASCII字符串。C语言是编程语言的基础,被广泛应用于系统编程和嵌入式开发,因此一个C语言实现的Base64...

    Base64编码解码工具V1.5

    在Base64编码中,每个3个字节的二进制数据块会被转换为4个Base64字符。 Base64编码的主要原理是将每3个8位字节(24位)的数据分成4个6位组(每个6位可以表示0-63的十进制数),然后将这些数值映射到Base64字符集中...

    java和js相互base64编码解码

    在IT行业中,Base64是一种常见的数据编码方式,它将任意二进制数据转换为可打印的ASCII字符,常用于在网络上传输包含非ASCII字符的数据,如图片或PDF等。在Java和JavaScript中,Base64编码和解码是两个重要的功能,...

    易语言 base64编码转图片 如何 提高转换速度.zip

    在IT行业中,Base64编码是一种常见的数据编码方式,它将二进制数据转化为可打印的ASCII字符,常用于在网络上传输图片、音频或视频等非文本数据。易语言作为一款中国本土化的编程语言,提供了处理Base64编码的功能。...

    js 显示base64编码的二进制流网页图片

    Base64编码是一种编码方法,它将二进制数据转换为ASCII字符串格式。这种编码方式主要适用于编码那些无法直接通过文本格式传输的数据,比如图片、音频、视频等二进制文件。Base64编码通过把每3个字节的二进制数据转换...

    base64编码解码离线工具

    Base64编码是一种在网络上传输二进制数据时常用的编码方式,它将任意二进制数据转换成可打印的ASCII字符序列。这种编码方法最初是为了在电子邮件系统中传输非ASCII字符而设计的,如今在很多场景下都有应用,如图片...

    Base64编码jar包

    注意,虽然这里介绍的是`javabase64-1.3.1.jar`库,但Java 8及更高版本已经内置了`java.util.Base64`类,提供了一套标准的Base64编码和解码接口,因此你也可以选择使用Java自带的API,具体用法类似。 总的来说,...

    Base64系列第四篇 C/C++中使用Base64编码解码(从chromium库中抽取)

    本篇将深入探讨如何在C/C++环境中,利用从Chromium库中提取的代码进行Base64的编码与解码。 首先,Base64编码的原理是将每3个字节(24位)的数据转换为4个6位的字符,然后将这4个6位字符对应到Base64的字符集(包括...

    BASE64编码方法

    **BASE64编码方法** BASE64是一种广泛用于网络数据传输和存储的编码方式,它将任意二进制数据转换成可打印的ASCII字符序列。这种方法最初被设计用来在电子邮件系统中传输非ASCII字符,现在则被应用于各种场景,如在...

    base64 编码与解码 中文完美支持

    Base64编码的过程是这样的:首先,将二进制数据按每3个字节分为一组(24位),然后将这24位数据转换成4个6位的二进制数,每个6位对应Base64字符集中的一位。因为6位最多能表示64种状态,所以正好可以对应64个不同的...

    QT图片BAse64编码与解码

    QT图片Base64编码与解码是C++编程中一种常见的技术,特别是在处理网络传输或者存储图片数据时。Base64是一种将二进制数据转换为可打印ASCII字符的编码方式,它通过特定的算法将每3个字节的数据转换为4个ASCII字符,...

    Base64编码和解码的应用(前后端程序)

    Base64编码是一种将二进制数据转换为可打印ASCII字符的编码方式,常用于在网络上传输非ASCII字符,如图片或PDF等。在前端开发中,Base64编码经常被用于将图片转换为字符串,以便嵌入到HTML或者CSS中。在后端,Base64...

    c++ base64 编码

    在IT领域,Base64是一种用于在网络上传输和存储非ASCII字符的数据编码方式。它将任意二进制数据转换为可打印的ASCII字符序列,主要应用于电子邮件、HTTP传输以及XML文档中。C++作为一门通用的编程语言,也支持Base64...

    将图片进行Base64编码后传输

    "将图片进行Base64编码后传输"是一种高效且便捷的方式,它允许我们直接将图片数据嵌入到文本格式中,方便在网络中传递。这种技术广泛应用于JSON API、HTML页面以及任何不支持二进制数据流的系统。 Base64是一种编码...

    js对图片base64编码字符串进行解码并输出图像示例

    需要注意的是,这段代码没有提供完整的Base64解码逻辑,实际的`decodeBase64`函数需要实现Base64编码的解码算法,这通常涉及到将Base64字符映射回它们代表的二进制值。 总的来说,这个示例展示了JavaScript在处理二...

Global site tag (gtag.js) - Google Analytics