package com.frady.util;
import java.io.ByteArrayOutputStream;
/**
* Base64编码/解码器
*/
public class Base64Util {
private final static char[] BASE64_ENCODING_TABLE;
private final static byte[] BASE64_DECODING_TABLE;
static
{
BASE64_ENCODING_TABLE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
BASE64_DECODING_TABLE=new byte[]
{
-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,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,
-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 Base64Util()
{
}
/**
* 将数据进行Base64编码。
* @param data 数据
* @param offset 数据中的初始偏移量
* @param length 写入的字节数
* @return 编码后的字符串
*/
public final static String encode(byte[] data,int offset,int length)
{
if(data==null)
{
return null;
}
StringBuffer buffer=new StringBuffer();
int[] temp=new int[3];
int end=offset+length;
while(offset<end)
{
temp[0]=data[offset++]&255;
if(offset==data.length)
{
buffer.append(BASE64_ENCODING_TABLE[(temp[0]>>>2)&63]);
buffer.append(BASE64_ENCODING_TABLE[(temp[0]<<4)&63]);
buffer.append('=');
buffer.append('=');
break;
}
temp[1]=data[offset++]&255;
if(offset==data.length)
{
buffer.append(BASE64_ENCODING_TABLE[(temp[0]>>>2)&63]);
buffer.append(BASE64_ENCODING_TABLE[((temp[0]<<4)|(temp[1]>>>4))&63]);
buffer.append(BASE64_ENCODING_TABLE[(temp[1]<<2)&63]);
buffer.append('=');
break;
}
temp[2]=data[offset++]&255;
buffer.append(BASE64_ENCODING_TABLE[(temp[0]>>>2)&63]);
buffer.append(BASE64_ENCODING_TABLE[((temp[0]<<4)|(temp[1]>>>4))&63]);
buffer.append(BASE64_ENCODING_TABLE[((temp[1]<<2)|(temp[2]>>>6))&63]);
buffer.append(BASE64_ENCODING_TABLE[temp[2]&63]);
}
return buffer.toString();
}
/**
* 将数据进行Base64编码。
* @param data 数据
* @return 编码后的字符串
*/
public final static String encode(byte[] data)
{
return encode(data,0,data.length);
}
/**
* 将字符串进行Base64编码。
* @param str 字符串
* @return 编码后的字符串
*/
public final static String encode(String str)
{
return encode(str.getBytes());
}
/**
* 对使用Base64编码的字符串进行解码。
* @param str 经过编码的字符串
* @return 解码后的数据
*/
public final static String decode(String str)
{
if(str==null)
{
return null;
}
ByteArrayOutputStream buffer=new ByteArrayOutputStream();
byte[] data=str.getBytes();
int[] temp=new int[4];
int index=0;
while(index<data.length)
{
do
{
temp[0]=BASE64_DECODING_TABLE[data[index++]];
}while(index<data.length&&temp[0]==-1);
if(temp[0]==-1)
{
break;
}
do
{
temp[1]=BASE64_DECODING_TABLE[data[index++]];
}while(index<data.length&&temp[1]==-1);
if(temp[1]==-1)
{
break;
}
buffer.write(((temp[0]<<2)&255)|((temp[1]>>>4)&255));
do
{
temp[2]=data[index++];
if(temp[2]==61)
{
return new String(buffer.toByteArray());
}
temp[2]=BASE64_DECODING_TABLE[temp[2]];
}while(index<data.length&&temp[2]==-1);
if(temp[2]==-1)
{
break;
}
buffer.write(((temp[1]<<4)&255)|((temp[2]>>>2)&255));
do
{
temp[3]=data[index++];
if(temp[3]==61)
{
return new String(buffer.toByteArray());
}
temp[3]=BASE64_DECODING_TABLE[temp[3]];
}while(index<data.length&&temp[3]==-1);
if(temp[3]==-1)
{
break;
}
buffer.write(((temp[2]<<6)&255)|temp[3]);
}
return new String(buffer.toByteArray());
}
public static void main (String args[]){
System.out.println(Base64Util.encode("中华人民共和国"));
System.out.println(Base64Util.decode("1tC7qsjLw/G5srrNufo="));
System.out.println(Base64Util.encode("123abc"));
System.out.println(Base64Util.decode("MTIzYWJj"));
}
}
分享到:
相关推荐
一个用于base64编码/解码以及base64Url支持的.NET库。 可以对byte类型(对于UTF-8)或char类型的缓冲区进行编码。 解码可以从类型为byte (对于UTF-8)或char类型的缓冲区中读取。 编码/解码支持缓冲区链,例如...
主要是实现图片和base64互相转换,里面包含图片转换为base64的代码,base64转换为图片的代码
开发工具Markdown工具marktext-x64-win免安装版
MarkMark是一款极其智能轻便的设计图标注、测量工具,融入放大镜和智能区域选取功能。MarkMark能让设计师更快捷高效的完成标注,标注从未变得如此简单 自动测量区域 使用测量区域工具M的同时,点按Tab键,会自动...
marktext-x64-win0.17.1-中文包.rar,中文包,解压即用,最新版本
marktext的中文包marktext的中文包
MarkMark是一款绿色小巧且简单实用的图像测量工具,为用户提供自动测量区域,像素,对图像进行精细测量,提供放大镜等功能,能让设计师更快捷高效的完成标注,使用MarkMark,标注从未变得如此简单。
新型轻量级Markdown编辑器——Marktext的安装包,源地址下载速度奇慢,所以在这里保存一份方便下载。
mark地址修改
一个高层线程工具类(Timer)---马克-to-win java视频
MarkText是一个MIT许可的开源项目,最新的版本可以从GitHub发布页面免费下载。MarkText还在发展中,它的发展离不开所有的赞助商。 特点: 实时预览(所见即所得)和一个干净和简单的界面。 支持CommonMark Spec, ...
好用的markdown编辑工具,亲测,免费,界面友好,操作简单
Mark点匹配算法,一个开卷设备,有一盘料带,一行有16个件,料带上有若干行,CCD去一行一行的检测,当检测到其中一行有一个或多个不良的工件时,会把不良工件的位置坐标给PLC(主要是给行坐标,也就是这一行上的第几...
n阶自适应算术编码压缩算法的C++类 参考 :Mark Nelson的实例
bios添加slic2.1的工具,具体使用见说明。 BIOS必须符合以下条件: 1、必须是LENOVE的AMI APTIO EFI BIOS;(AMIBIOS8.x不行); 2、MARK的OEM TABLE ID必须与原机相同;
一个很小很实用的水印工具,你可以添加文字水印,也可以添加图片水印。
广工数据结构课程设计 哈夫曼树结构体定义 typedef struct Huffmantree { char ch; //键值 int weight,mark; //weight为权值,mark为标志域 ...使用链树存储,建立哈夫曼函数,编码函数,译码函数来实现功能。
最新免安装版本。下载该软件时,由于在github托管,安装包是放在亚马逊云上的,时经常只有几Kb速度,还经常失败。所以下载好放这儿,以后会经常更新。
service 实现类 public PageResult queryPageList(Integer page, Integer rows, User user) { PageResult pageResult = new PageResult(); HashMap, Object> hashMap = new HashMap, Object>(); hashMap.put(...
MarkMark.exe MarkMark是一款非常实用的最新图片测量软件。这款图像测量系统同时也是一款简单设计标注、测量工具,它有自动测量区域像素、放大区域等功能,适用于需要对图像进行精确测量的用户使用!