import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.util.zip.Deflater;

import java.util.zip.Inflater;

public class Base64 {

/**

* Byte value that maps to 'a' in Base64 encoding

*/

private final static int LOWER_CASE_A_VALUE = 26;

/**

* Byte value that maps to '0' in Base64 encoding

*/

private final static int ZERO_VALUE = 52;

/**

* Byte value that maps to '+' in Base64 encoding

*/

private final static int PLUS_VALUE = 62;

/**

* Byte value that maps to '/' in Base64 encoding

*/

private final static int SLASH_VALUE = 63;

/**

* Bit mask for one character worth of bits in Base64 encoding. Equivalent

* to binary value 111111b.

*/

private final static int SIX_BIT_MASK = 63;

/**

* Bit mask for one byte worth of bits in Base64 encoding. Equivalent to

* binary value 11111111b.

*/

private static final int EIGHT_BIT_MASK = 0xFF;

/**

* The input String to be decoded

*/

private String mString;

/**

* Current position in the String(to be decoded)

*/

private int mIndex = 0;

/**

* Encode an array of bytes using Base64

*

* @param data[]

*            The bytes to be encoded

* @return A valid Base64 representation of the input

*/

public static String encode(byte data[])

{

return new Base64().internalEncode(data);

}

/**

* Encode an array of bytes using Base64

*

* @param data[]

*            The bytes to be encoded

* @return A valid Base64 representation of the input

*/

public String internalEncode(byte data[])

{

// Base64 encoding yields a String that is 33% longer than the byte

// array

int charCount = ((data.length * 4) / 3) + 4;

// New lines will also be needed for every 76 charactesr, so allocate a

// StringBuffer that is long enough to hold the full result without

// having to expand later

StringBuffer result = new StringBuffer((charCount * 77) / 76);

int byteArrayLength = data.length;

int byteArrayIndex = 0;

int byteTriplet = 0;

while (byteArrayIndex < byteArrayLength - 2)

{

// Build the 24 bit byte triplet from the input data

byteTriplet = convertUnsignedByteToInt(data[byteArrayIndex++]);

// Each input byte contributes 8 bits to the triplet

byteTriplet <<= 8;

byteTriplet |= convertUnsignedByteToInt(data[byteArrayIndex++]);

byteTriplet <<= 8;

byteTriplet |= convertUnsignedByteToInt(data[byteArrayIndex++]);

// Look at the lowest order six bits and remember them

byte b4 = (byte) (SIX_BIT_MASK & byteTriplet);

// Move the byte triplet to get the next 6 bit value

byteTriplet >>= 6;

byte b3 = (byte) (SIX_BIT_MASK & byteTriplet);

byteTriplet >>= 6;

byte b2 = (byte) (SIX_BIT_MASK & byteTriplet);

byteTriplet >>= 6;

byte b1 = (byte) (SIX_BIT_MASK & byteTriplet);

// Add the Base64 encoded character to the result String

result.append(mapByteToChar(b1));

result.append(mapByteToChar(b2));

result.append(mapByteToChar(b3));

result.append(mapByteToChar(b4));

// There are 57 bytes for every 76 characters, so wrap the line when

// needed

// if ( byteArrayIndex % 57 == 0 ) {

// result.append( "\n" );

// }

}

// Check if we have one byte left over

if (byteArrayIndex == byteArrayLength - 1)

{

// Convert our one byte to an int

byteTriplet = convertUnsignedByteToInt(data[byteArrayIndex++]);

// Right pad the second 6 bit value with zeros

byteTriplet <<= 4;

byte b2 = (byte) (SIX_BIT_MASK & byteTriplet);

byteTriplet >>= 6;

byte b1 = (byte) (SIX_BIT_MASK & byteTriplet);

result.append(mapByteToChar(b1));

result.append(mapByteToChar(b2));

// Add "==" to the output to make it a multiple of 4 Base64

// characters

result.append("==");

}

// Check if we have two byte left over

if (byteArrayIndex == byteArrayLength - 2)

{

// Convert our two bytes to an int

byteTriplet = convertUnsignedByteToInt(data[byteArrayIndex++]);

byteTriplet <<= 8;

byteTriplet |= convertUnsignedByteToInt(data[byteArrayIndex++]);

// Right pad the third 6 bit value with zeros

byteTriplet <<= 2;

byte b3 = (byte) (SIX_BIT_MASK & byteTriplet);

byteTriplet >>= 6;

byte b2 = (byte) (SIX_BIT_MASK & byteTriplet);

byteTriplet >>= 6;

byte b1 = (byte) (SIX_BIT_MASK & byteTriplet);

result.append(mapByteToChar(b1));

result.append(mapByteToChar(b2));

result.append(mapByteToChar(b3));

// Add "==" to the output to make it a multiple of 4 Base64

// characters

result.append("=");

}

return result.toString();

}

/**

* Decode an input String using Base64

*

* @param data

*            The String to be decoded

* @return The appropriate byte array

*/

public static byte[] decode(String data)

{

return new Base64().internalDecode(data);

}

/**

* Decode an input String using Base64

*

* @param data

*            The String to be decoded

* @return The appropriate byte array

*/

public byte[] internalDecode(String data)

{

mString = data;

mIndex = 0;

/**

* Total number of Base64 characters in the input

*/

int mUsefulLength = 0;

int length = mString.length();

for (int i = 0; i < length; i++)

{

if (isUsefulChar(mString.charAt(i)))

{

mUsefulLength++;

}

}

// mString = data;

// A Base64 byte array is 75% the size of its String representation

int byteArrayLength = mUsefulLength * 3 / 4;

byte result[] = new byte[byteArrayLength];

int byteTriplet = 0;

int byteIndex = 0;

// Continue until we have less than 4 full characters left to

// decode in the input.

while (byteIndex + 2 < byteArrayLength)

{

// Package a set of four characters into a byte triplet

// Each character contributes 6 bits of useful information

byteTriplet = mapCharToInt(getNextUsefulChar());

byteTriplet <<= 6;

byteTriplet |= mapCharToInt(getNextUsefulChar());

byteTriplet <<= 6;

byteTriplet |= mapCharToInt(getNextUsefulChar());

byteTriplet <<= 6;

byteTriplet |= mapCharToInt(getNextUsefulChar());

// Grab a normal byte (eight bits) out of the byte triplet

// and put it in the byte array

result[byteIndex + 2] = (byte) (byteTriplet & EIGHT_BIT_MASK);

byteTriplet >>= 8;

result[byteIndex + 1] = (byte) (byteTriplet & EIGHT_BIT_MASK);

byteTriplet >>= 8;

result[byteIndex] = (byte) (byteTriplet & EIGHT_BIT_MASK);

byteIndex += 3;

}

// Check if we have one byte left to decode

if (byteIndex == byteArrayLength - 1)

{

// Take out the last two characters from the String

byteTriplet = mapCharToInt(getNextUsefulChar());

byteTriplet <<= 6;

byteTriplet |= mapCharToInt(getNextUsefulChar());

// Remove the padded zeros

byteTriplet >>= 4;

result[byteIndex] = (byte) (byteTriplet & EIGHT_BIT_MASK);

}

// Check if we have two bytes left to decode

if (byteIndex == byteArrayLength - 2)

{

// Take out the last three characters from the String

byteTriplet = mapCharToInt(getNextUsefulChar());

byteTriplet <<= 6;

byteTriplet |= mapCharToInt(getNextUsefulChar());

byteTriplet <<= 6;

byteTriplet |= mapCharToInt(getNextUsefulChar());

// Remove the padded zeros

byteTriplet >>= 2;

result[byteIndex + 1] = (byte) (byteTriplet & EIGHT_BIT_MASK);

byteTriplet >>= 8;

result[byteIndex] = (byte) (byteTriplet & EIGHT_BIT_MASK);

}

return result;

}

/**

* Convert a Base64 character to its 6 bit value as defined by the mapping.

*

* @param c

*            Base64 character to decode

* @return int representation of 6 bit value

*/

private int mapCharToInt(char c)

{

if (c >= 'A' && c <= 'Z')

{

return c - 'A';

}

if (c >= 'a' && c <= 'z')

{

return (c - 'a') + LOWER_CASE_A_VALUE;

}

if (c >= '0' && c <= '9')

{

return (c - '0') + ZERO_VALUE;

}

if (c == '+')

{

return PLUS_VALUE;

}

if (c == '/')

{

return SLASH_VALUE;

}

throw new IllegalArgumentException(c + " is not a valid Base64 character.");

}

/**

* Convert a byte between 0 and 63 to its Base64 character equivalent

*

* @param b

*            Byte value to be converted

* @return Base64 char value

*/

private char mapByteToChar(byte b)

{

if (b < LOWER_CASE_A_VALUE)

{

return (char) ('A' + b);

}

if (b < ZERO_VALUE)

{

return (char) ('a' + (b - LOWER_CASE_A_VALUE));

}

if (b < PLUS_VALUE)

{

return (char) ('0' + (b - ZERO_VALUE));

}

if (b == PLUS_VALUE)

{

return '+';

}

if (b == SLASH_VALUE)

{

return '/';

}

throw new IllegalArgumentException("Byte " + new Integer(b) + " is not a valid Base64 value");

}

/**

* @param c

*            Character to be examined

* @return Whether or not the character is a Base64 character

*/

private boolean isUsefulChar(char c)

{

return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || (c == '+') || (c == '/');

}

/**

* Traverse the String until hitting the next Base64 character. Assumes that

* there is still another valid Base64 character left in the String.

*/

private char getNextUsefulChar()

{

char result = '_'; // Start with a non-Base64 character

while (!isUsefulChar(result))

{

result = mString.charAt(mIndex++);

}

return result;

}

/**

* Convert a byte to an integer. Needed because in Java bytes are signed,

* and for Base64 purposes they are not. If not done this way, when

* converted to an int, 0xFF will become -127

*

* @param b

*            Byte value to be converted

* @return Value as an integer, as if byte was unsigned

*/

private int convertUnsignedByteToInt(byte b)

{

if (b >= 0)

{

return (int) b;

}

return 256 + b;

}

public static String getEncodeMsg(String tMessage)

{

String returnStr = "";

try

{

ByteArrayOutputStream byteStream = getCompressedStr(tMessage);

if(byteStream!=null)

returnStr = Base64.encode(byteStream.toByteArray());

//returnStr = Base64.encode(tMessage.getBytes("UTF-8"));

}

catch (Exception ex)

{

ex.printStackTrace();

}

return returnStr;

}

private static ByteArrayOutputStream getCompressedStr(String tMessage)

{

ByteArrayOutputStream compressedStream = null;

try

{

if (tMessage != null && !"".equals(tMessage))

{

byte[] input = tMessage.getBytes("UTF-8");

Deflater compresser = new Deflater();

compresser.setInput(input);

compresser.finish();

compressedStream = new ByteArrayOutputStream();

byte[] buf = new byte[2048];

while (!compresser.finished())

{

int got = compresser.deflate(buf);

compressedStream.write(buf, 0, got);

}

}

}

catch (Exception ex)

{

ex.printStackTrace();

}

finally

{

if (compressedStream != null)

{

try

{

compressedStream.close();

}

catch (IOException ioex)

{

ioex.printStackTrace();

}

}

}

return compressedStream;

}

public static String getDecodeMsg(String tMessage)

{

String outputString = "";

byte[] inputStr  = null;

try

{

String newStr = tMessage;

newStr = newStr.replaceAll(" ", "+");

inputStr = Base64.decode(newStr);

outputString = getDeCompressedStr(inputStr);

}

catch (Exception ex)

{

ex.printStackTrace();

}

return outputString;

//      return new String(inputStr);

}

private static String getDeCompressedStr(byte[] tMessage)

{

String returnStr = "";

ByteArrayOutputStream aDeCompressedStream = null;

try

{

// Decompress the bytes

Inflater decompresser = new Inflater();

decompresser.setInput(tMessage);

aDeCompressedStream = new ByteArrayOutputStream();

byte[] buf = new byte[2048];

while (!decompresser.finished())

{

int got = decompresser.inflate(buf);

aDeCompressedStream.write(buf, 0, got);

}

}

catch (Exception ex)

{

ex.printStackTrace();

} finally

{

try

{

if(aDeCompressedStream!=null)

aDeCompressedStream.close();

}

catch (IOException ioex)

{

ioex.printStackTrace();

}

}

try

{

returnStr = aDeCompressedStream.toString("UTF-8");

}

catch (UnsupportedEncodingException encodeEx)

{

encodeEx.printStackTrace();

}

return returnStr;

}

}

Base64(2)的更多相关文章

  1. linux shell 不同进制数据转换(二进制,八进制,十六进制,base64) (转)

    shell可以在不调用第3方命令,表示不同进制数据.这里总结以下表示方法.shell 脚本默认数值是由10 进制数处理,除非这个数字某种特殊的标记法或前缀开头. 才可以表示其它进制类型数值.如:以 0 ...

  2. 将上传图片转成base64(转)

    效果如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"><titl ...

  3. js转base64(数字)

    var name='测试文字'; var t_name=encodeURIComponent(name); t_name=window.btoa(t_name); console.log(t_name ...

  4. hdu 5237 Base64(模拟)

    Base64 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  5. Base64(3)

    public final class Base64 { static private final int     BASELENGTH           = 128; static private ...

  6. WebSocket协议探究(一)

    一 复习和目标 1 复习 上一节使用wireshark抓包分析了WebSocket流量 包含连接的建立:HTTP协议升级WebSocket协议 使用建立完成的WebSocket协议发送数据 2 目标 ...

  7. cookie规范(RFC6265)翻译

    来源:https://github.com/renaesop/blog/issues/4 RFC 6265 要点翻译 1.简介 本文档定义了HTTP Cookie以及HTTP头的Set-Cookie字 ...

  8. (iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题

    我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法.我记得我在前一个项目中使用的就是这两种加密算法的结合:Bas ...

  9. Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

    Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC 博客分类: Java/Security Javabase64macmd5sha     加密解密,曾经是我一 ...

随机推荐

  1. influxDB应用及TICK stack

    InfluxData平台用于处理度量和事件的时间序列平台,常被称为TICK stack,包含4个组件:Telegraf,influxDB,Chronograf和Kapacitor,分别负责时间序列数据 ...

  2. Linux之RHEL7root密码破解(三)

    Linux系列root密码破解第三种方式,利用修改boot分区里的开机启动顺序来修改密码,即我们进入BIOS,修改boot启动顺序为CD-ROM: 接下来按F10保存退出 选择Troubleshoot ...

  3. ant安装(Windows)

    ant安装(Windows) ant 下载之前参考一下官网的ant与java版本依赖 1. 下载地址 2. 解压与配置 1. 下载地址 ant官网 所有版本 2. 解压与配置 java版本:1.8.0 ...

  4. ps aux|grep *** 解释

    对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大的进程查看命令. 使用该命令 可以确定有哪些进程正在运 ...

  5. src挖掘过程之信息收集

    信息收集 1.厂商域名   2.厂商ip段   3.厂商业务信息 域名收集 1.基于SSL证书查询   2.第三方网站接口查询   3.Github   4.DNS解析记录   5.子域名枚举等 基于 ...

  6. 大数据JavaWeb之java基础巩固----Junit&反射&注解

    最近打算从0开始学学大数据,目前的主业是Android开发,但是当年毕业之后其实是搞J2EE的,所以打算没事又来拓展一下后台的技能,扩宽一下自己的知识体系对于自己的未来也能够多一些可能,另外大数据的一 ...

  7. hexo利用SAE提高网页打开速度

    起因 之前一直觉得网页加载速度其实也还行,就是有两个图标加载的非常慢,经常是网页都出来了,那两个图标还是个方框,要等好久才出来.终于,好好研究了一番,发现那个图标是fontawesome里的,然后字体 ...

  8. 基于Asp.net core + EF + Sqlite 5分钟快速上手一个小项目

    虽然该方法不会用在实际开发中,但该过程对于初学者还是非常友好的,真应了麻雀虽小,五脏俱全这句话了.好了不多废话了,直接开始!! 1.建立一个名为test的Asp.net core web应用程序 这一 ...

  9. 项目Beta冲刺 - 凡事预则立

    课程: 软件工程1916|W(福州大学) 作业要求: 项目Beta冲刺 团队名称: 火鸡堂 作业目标: 尽力交付 火鸡堂 队员学号 队员姓名 博客地址 备注 221600111 彼术向 http:// ...

  10. java 获取对象的数据类型

    // java 获取对象的数据类型 public static String getType(Object object){ String typeName=object.getClass().get ...