Base64的java实现

上一篇了解了Base64编码的原理,下面是java的实现:

public final class Base64 {

private static final byte PAD = (byte) ‘=‘;

private static final int BASELENGTH = 255;

private static final int LOOKUPLENGTH = 64;

private static final int SIGN = -128;//8位全1

private static byte[] base64Alphabet = new byte[BASELENGTH];

private static byte[] lookUpBase64Alphabet = new byte[LOOKUPLENGTH];

// Populating the lookup and character arrays

static {

for (int i = 0; i < BASELENGTH; i++) {

base64Alphabet[i] = (byte) -1;

}

for (int i = ‘Z‘; i >= ‘A‘; i--) {

base64Alphabet[i] = (byte) (i - ‘A‘);

}

for (int i = ‘z‘; i >= ‘a‘; i--) {

base64Alphabet[i] = (byte) (i - ‘a‘ + 26);

}

for (int i = ‘9‘; i >= ‘0‘; i--) {

base64Alphabet[i] = (byte) (i - ‘0‘ + 52);

}

base64Alphabet[‘+‘] = 62;

base64Alphabet[‘/‘] = 63;

for (int i = 0; i <= 25; i++) {

lookUpBase64Alphabet[i] = (byte) (‘A‘ + i);

}

for (int i = 26, j = 0; i <= 51; i++, j++) {

lookUpBase64Alphabet[i] = (byte) (‘a‘ + j);

}

for (int i = 52, j = 0; i <= 61; i++, j++) {

lookUpBase64Alphabet[i] = (byte) (‘0‘ + j);

}

lookUpBase64Alphabet[62] = (byte) ‘+‘;

lookUpBase64Alphabet[63] = (byte) ‘/‘;

}

/**

* Encodes binary data using the base64 algorithm, optionally chunking the output into 76 character blocks.

*

* @param binaryData Array containing binary data to encode.

* @return Base64-encoded data.

*/

public static byte[] encodeBase64(byte[] binaryData) {

int lengthDataBits = binaryData.length * 8;

int fewerThan24bits = lengthDataBits % 24;

int numberTriplets = lengthDataBits / 24;

byte encodedData[] = null;

int encodedDataLength = 0;

if (fewerThan24bits != 0) {

//data not divisible by 24 bit

encodedDataLength = (numberTriplets + 1) * 4;

} else {

// 16 or 8 bit

encodedDataLength = numberTriplets * 4;

}

encodedData = new byte[encodedDataLength];

byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;

int encodedIndex = 0;

int dataIndex = 0;

int i = 0;

//log.debug("number of triplets = " + numberTriplets);

for (i = 0; i < numberTriplets; i++) {

dataIndex = i * 3;

b1 = binaryData[dataIndex];

b2 = binaryData[dataIndex + 1];

b3 = binaryData[dataIndex + 2];

//log.debug("b1= " + b1 +", b2= " + b2 + ", b3= " + b3);

l = (byte) (b2 & 0x0f);//前4位

k = (byte) (b1 & 0x03);//前2位

byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);//>>优先级高于^,取前6位

byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);//取前4位

byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);//取前2位

encodedData[encodedIndex] = lookUpBase64Alphabet[val1];

//log.debug( "val2 = " + val2 );

//log.debug( "k4   = " + (k<<4) );

//log.debug(  "vak  = " + (val2 | (k<<4)) );

encodedData[encodedIndex + 1] = lookUpBase64Alphabet[val2 | (k << 4)];

encodedData[encodedIndex + 2] = lookUpBase64Alphabet[(l << 2) | val3];

encodedData[encodedIndex + 3] = lookUpBase64Alphabet[b3 & 0x3f];//取最后6位

encodedIndex += 4;

}

// form integral number of 6-bit groups

dataIndex = i * 3;

if (fewerThan24bits == 8) {

b1 = binaryData[dataIndex];

k = (byte) (b1 & 0x03);

//log.debug("b1=" + b1);

//log.debug("b1<<2 = " + (b1>>2) );

byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);

encodedData[encodedIndex] = lookUpBase64Alphabet[val1];

encodedData[encodedIndex + 1] = lookUpBase64Alphabet[k << 4];

encodedData[encodedIndex + 2] = PAD;

encodedData[encodedIndex + 3] = PAD;

} else if (fewerThan24bits == 16) {

b1 = binaryData[dataIndex];

b2 = binaryData[dataIndex + 1];

l = (byte) (b2 & 0x0f);

k = (byte) (b1 & 0x03);

byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);

byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);

encodedData[encodedIndex] = lookUpBase64Alphabet[val1];

encodedData[encodedIndex + 1] = lookUpBase64Alphabet[val2 | (k << 4)];

encodedData[encodedIndex + 2] = lookUpBase64Alphabet[l << 2];

encodedData[encodedIndex + 3] = PAD;

}

return encodedData;

}

/**

* Decodes Base64 data into octects

*

* @param base64Data Byte array containing Base64 data

* @return Array containing decoded data.

*/

public static byte[] decodeBase64(byte[] base64Data) {

// handle the edge case, so we don‘t have to worry about it later

if (base64Data.length == 0) {

return new byte[0];

}

int numberQuadruple = base64Data.length / 4;

byte decodedData[] = null;

byte b1 = 0, b2 = 0, b3 = 0, b4 = 0, marker0 = 0, marker1 = 0;

// Throw away anything not in base64Data

int encodedIndex = 0;

int dataIndex = 0;

{

// this sizes the output array properly - rlw

int lastData = base64Data.length;

// ignore the ‘=‘ padding

while (base64Data[lastData - 1] == PAD) {

if (--lastData == 0) {

return new byte[0];

}

}

decodedData = new byte[lastData - numberQuadruple];

}

for (int i = 0; i < numberQuadruple; i++) {

dataIndex = i * 4;

marker0 = base64Data[dataIndex + 2];

marker1 = base64Data[dataIndex + 3];

b1 = base64Alphabet[base64Data[dataIndex]];

b2 = base64Alphabet[base64Data[dataIndex + 1]];

if (marker0 != PAD && marker1 != PAD) {

//No PAD e.g 3cQl

b3 = base64Alphabet[marker0];

b4 = base64Alphabet[marker1];

decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);

decodedData[encodedIndex + 1] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));

decodedData[encodedIndex + 2] = (byte) (b3 << 6 | b4);

} else if (marker0 == PAD) {

//Two PAD e.g. 3c[Pad][Pad]

decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);

} else if (marker1 == PAD) {

//One PAD e.g. 3cQ[Pad]

b3 = base64Alphabet[marker0];

decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);

decodedData[encodedIndex + 1] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));

}

encodedIndex += 3;

}

return decodedData;

}

}

时间: 2024-08-30 17:54:49

Base64的java实现的相关文章

java Base64 [ Encode And Decode In Base64 Using Java ]

http://www.javatips.net/blog/2011/08/how-to-encode-and-decode-in-base64-using-java http://commons.apache.org/proper/commons-codec/ 官方下载链接 Encode And Decode In Base64 Using Java explains about different techniques for Encode Base64 using java / Decode

Java对图片Base64转码--HTML对Base64解码 [ Java加强版 ]

Java对图片Base64编码 package base64; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.Rand

Base64编码Java实现

一.什么是Base64编码 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一.Base64 主要不是加密,它主要的用途是把一些二进制数转成普通字符用于网络传输. 由于一些二进制字符在传输协议中属于控制字符,不能直接传送需要转换一下.Base64编码就是把二进制字节序列转化为ASCII字符序列.一般增加1/3长度,而且也是不可读的. 使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途. 二.Base64原理 [源

将图片转换为base64字符串Java代码

/** @Descriptionmap 将图片文件转化为字节数组字符串,并对其进行Base64编码处理 @author temdy @Date 2015-01-26 @param path 图片路径 @return */ public static String imageToBase64(String path) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理 byte[] data = null; // 读取图片字节数组 try { InputStream in =

java环境下的base64解码程序设计

最近遇到一个ctf题,要求求解一个字符串经过几次base64解码可以恢复成正常的字符串.原题的字符串如下: Vm0wd2QyUXlVWGxWV0d4V1YwZDRWMVl3WkRSV01WbDNXa1JTVjAxV2JETlhhMUpUVmpBeFYySkVUbGhoTVVwVVZtcEJlRll5U2tWVWJHaG9UVlZ3VlZacVFtRlRNbEpJVm10a1dHSkdjRTlaVjNSR1pVWmFkR05GU214U2JHdzFWVEowVjFaWFNraGhSemxWVmpO

Java对图片Base64转码--HTML对Base64解码

Java对图片Base64转码 package base64; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import sun.misc.BASE64Decod

java base64图片编码解码

image.base64.Base64ImageConvertor.java package image; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.*; public class Base64ImageConvertor {     public static String convertImageToString(File file) throws Exception {     

Java加密系列之(二)Base64加密

sun.misc.BASE64Encoder/BASE64Decoder类不属于JDK标准库范畴,但在JDK中包含了该类,可以直接使用,但这个没有java doc,属于jdk里不推荐使用的工具类.强烈建议不要用sun.misc,是不安全的. bouncycastle的jar包下载地址:http://www.bouncycastle.org/latest_releases.html package com.tvm.mrz.security.base64; import java.io.IOExce

java工具类 文件zip压缩 base64 加密,base64解密 zip解压

package com.cfam.utils; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;