Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
比如某一字符串转成字节码为:
11011001 01101010 00101100
110110010110101000101100
00110110 00010110 00101000 00101100
把8位的字节连成一串110110010110101000101100
然后每次顺序选6个出来之后再把这6二进制数前面再添加两个0,就成了一个新的字节。之后再选出6个来,再添加0,依此类推,直到24个二进制数全部被选完。
当代码量不是3的整数倍时,代码量/3的余数自然就是2或者1。转换的时候,结果不够6位的在后面用0来补上相应的位置,之后再在6位的前面补两个0。转换完空出的结果就用就用“=”来补位。
如果余1,就补“==”
如果余2,就补“=”
下面是具体的代码实现:
Java代码
import sun.misc.BASE64Decoder;
public class Base64Test {
private final static String CODE_STR = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
private final static int ORGINAL_LEN = 8;
private final static int NEW_LEN = 6;
public static void main(String[] args){
System.out.println(encodeBase64("honda418"));
System.out.println(getBASE64("honda418"));
}
/**
* 把str转换成Base64编码
* @param str
* @return
*/
public static String encodeBase64(String str){
String binStr = getBinStr(str);
int oldByteLen = binStr.length() / ORGINAL_LEN; //原始字节数,数字字母占1个,中文占2个
int newByteLen = oldByteLen * 4 / 3; //新的字节数
String appendStr = ""; //最后面该不该加“=”
switch(oldByteLen % 3){
case 0 : break;
case 1 : newByteLen = newByteLen + 1; appendStr = "=="; break;
case 2 : newByteLen = newByteLen + 1; appendStr = "="; break;
}
StringBuilder base64Str = new StringBuilder("");
for(int k = 0; k < newByteLen; k++){
String bin = "";
// 二进制字符串按照6个一组分隔
if((k+1) * NEW_LEN > binStr.length()){
bin = binStr.substring(k * NEW_LEN, binStr.length());
}else{
bin = binStr.substring(k * NEW_LEN, (k+1) * NEW_LEN);
}
int intval = Integer.parseInt(bin, 2); //二进制转成十进制
if(bin.length() < NEW_LEN){
/**
* 不足6位时右侧补0
* 0101 -- > 010100 (补2个0)
* 10 -- > 100000 (补4个0)
*/
intval <<= NEW_LEN - bin.length();
}
//从码表里面查找当前字符,返回字符在码表中的位置
base64Str = base64Str.append(CODE_STR.charAt(intval));
}
base64Str = base64Str.append(appendStr);
return base64Str.toString();
}
/**
* 把字符串转行成二进制,再把二进制拼接起来
* 返回拼接后的二进制字符串
* @param str
* @return
*/
public static String getBinStr(String str){
// 采用默认语言环境的 character set。
byte[] b = str.getBytes();
StringBuilder sb = new StringBuilder("");
for(byte c : b){
String tmpStr = Integer.toBinaryString(c);
System.out.println(tmpStr);
if(tmpStr.length() > ORGINAL_LEN){
//截取, 如: "1111111111111111111111111010101" to "11010101"
sb.append(tmpStr.substring(tmpStr.length() - ORGINAL_LEN, tmpStr.length()));
}else if(tmpStr.length() < ORGINAL_LEN){
//前补0, 如: "110011" to "00110011"
int i = 0;
while(tmpStr.length() + i < ORGINAL_LEN){
i ++;
sb.append("0");
}
sb.append(tmpStr);
}else{
sb.append(tmpStr);
}
}
return sb.toString();
}
// 用SUN自带的进行BASE 64编码
public static String getBASE64(String s) {
if (s == null)
return null;
return (new sun.misc.BASE64Encoder()).encode(s.getBytes());
}
// 将 BASE64 编码的字符串 s 进行解码
public static String getFromBASE64(String s) {
if (s == null)
return null;
BASE64Decoder decoder = new BASE64Decoder();
try {
byte[] b = decoder.decodeBuffer(s);
return new String(b);
} catch (Exception e) {
return null;
}
}
}
import sun.misc.BASE64Decoder;
public class Base64Test {
private final static String CODE_STR = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
private final static int ORGINAL_LEN = 8;
private final static int NEW_LEN = 6;
public static void main(String[] args){
System.out.println(encodeBase64("honda418"));
System.out.println(getBASE64("honda418"));
}
/**
* 把str转换成Base64编码
* @param str
* @return
*/
public static String encodeBase64(String str){
String binStr = getBinStr(str);
int oldByteLen = binStr.length() / ORGINAL_LEN; //原始字节数,数字字母占1个,中文占2个
int newByteLen = oldByteLen * 4 / 3; //新的字节数
String appendStr = ""; //最后面该不该加“=”
switch(oldByteLen % 3){
case 0 : break;
case 1 : newByteLen = newByteLen + 1; appendStr = "=="; break;
case 2 : newByteLen = newByteLen + 1; appendStr = "="; break;
}
StringBuilder base64Str = new StringBuilder("");
for(int k = 0; k < newByteLen; k++){
String bin = "";
// 二进制字符串按照6个一组分隔
if((k+1) * NEW_LEN > binStr.length()){
bin = binStr.substring(k * NEW_LEN, binStr.length());
}else{
bin = binStr.substring(k * NEW_LEN, (k+1) * NEW_LEN);
}
int intval = Integer.parseInt(bin, 2); //二进制转成十进制
if(bin.length() < NEW_LEN){
/**
* 不足6位时右侧补0
* 0101 -- > 010100 (补2个0)
* 10 -- > 100000 (补4个0)
*/
intval <<= NEW_LEN - bin.length();
}
//从码表里面查找当前字符,返回字符在码表中的位置
base64Str = base64Str.append(CODE_STR.charAt(intval));
}
base64Str = base64Str.append(appendStr);
return base64Str.toString();
}
/**
* 把字符串转行成二进制,再把二进制拼接起来
* 返回拼接后的二进制字符串
* @param str
* @return
*/
public static String getBinStr(String str){
// 采用默认语言环境的 character set。
byte[] b = str.getBytes();
StringBuilder sb = new StringBuilder("");
for(byte c : b){
String tmpStr = Integer.toBinaryString(c);
System.out.println(tmpStr);
if(tmpStr.length() > ORGINAL_LEN){
//截取, 如: "1111111111111111111111111010101" to "11010101"
sb.append(tmpStr.substring(tmpStr.length() - ORGINAL_LEN, tmpStr.length()));
}else if(tmpStr.length() < ORGINAL_LEN){
//前补0, 如: "110011" to "00110011"
int i = 0;
while(tmpStr.length() + i < ORGINAL_LEN){
i ++;
sb.append("0");
}
sb.append(tmpStr);
}else{
sb.append(tmpStr);
}
}
return sb.toString();
}
// 用SUN自带的进行BASE 64编码
public static String getBASE64(String s) {
if (s == null)
return null;
return (new sun.misc.BASE64Encoder()).encode(s.getBytes());
}
// 将 BASE64 编码的字符串 s 进行解码
public static String getFromBASE64(String s) {
if (s == null)
return null;
BASE64Decoder decoder = new BASE64Decoder();
try {
byte[] b = decoder.decodeBuffer(s);
return new String(b);
} catch (Exception e) {
return null;
}
}
}
字符集编码采用默认语言环境的编码方式
最下面的2个方法是sun自带的编码解码方法。
此文转自 [url]http://honda418.iteye.com/blog/392006 [/url]
分享到:
相关推荐
测试时通常会用到一些hexstring参数,而在传递时需要转换成Base64String。这个小程序,能够很好的将HexString和Base64String相互转换。
Base64转String字符串,支持将Base64转化为String字符串
Base64工具类包,一般用于使用AES加密解密类中的使用工具类中需要引用的jar包
android用base64实现文件与string相互转换,绝对好用已测试通过。
提供一种Base64编码,并输出UTF-8格式的BASE64编码方式。本程序在微信小程序开发工具中已经测试通过。 Base64代码: [javascript] view plain copy print? (function(){ var BASE64_MAPPING = [ 'A','B','C','D',...
可实现Base64数据与String类型数据互转,Base64转string时产生的是HEX格式,转成ascll码即可。
base64包,decodeBase64包,encodeBase64String包所需的jar包 commons-codec-1.10.jar
Base64编码和解码库,支持API调用和COM调用,输入参数支持VB的字节数组Byte(),输出支持VB的字节数组Byte()和...Public Declare Sub DecodeFromVBStringEx Lib "Base64" (ByRef Dest() As Byte, ByRef Src As String)
pb10调用base64.dll,实现将图片转换成base64编码,将base64编码转换成图片 函数声明 function long GetFileEncode64(ref string filename, ref string encode64)library "base64" alias for "GetFileEncode64;...
base64转hexstring工具,可以自由输入base64字符,通过点击转换按钮,对数据进行解析,适合日志里打印的base64字符串,转换为byte字节
function Base64ToImage(const base64:string;AImage:TImage):Boolean; function Base64ToImageFile(const base64:string;AImagefile:string):Boolean; function CheckImgTypeBase64(abase64:string):string;
加密后字符串:String newKey=(new BASE64Encoder()).encodeBuffer(bt); 解密代码: 加密后的字符串:String newkey="*****"; byte[] bt = (new BASE64Decoder()).decodeBuffer(key); 解密后的字符串: String key=...
Function Base64Encode(InputData: String; Var OutputData: String): byte; {* 对数据进行BASE64编码,如编码成功返回Base64_OK | InputData:string - 要编码的数据 var OutputData: string - 编码后的数据 |...
2.选择使用把图片转换成Base64String,使用WCF,保存在Sqlserver数据库中。使用Base64String的方法,在数据库表里建一个varchar的字段就可以保存图片数据了。 3. 通过把图片流转换成Base64String保存到服务器数据库:
function long GetFileEncode64(ref string filename, ref string encode64)library "base64" alias for "GetFileEncode64;Ansi" function long Base64Decode(ref blob ouput, ref string input ,long inputlen)...
c#中 base64字符串与普通字符串互转,转成 Base64 形式的...
/** *base64加密与解密 ...* 2、解密:String keywords =new String(Base64.decode(keywords),"unicode"); *本JS使用方法如下: * 1、调用encode64(str)方法加密字符 * 2、调用decode64(str)方法解密字符 **/
C#,Base64转PDF文件,public void Base64StringToFile(string strbase64, string strurl)
var encoded : String = Base64 . encode ( source ); trace ( encoded ); var decoded : String = Base64 . decode ( encoded ); trace ( decoded ); //编码和解码ByteArray var obj : Object = { name : ...