Base64(2)
|
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)的更多相关文章
- linux shell 不同进制数据转换(二进制,八进制,十六进制,base64) (转)
shell可以在不调用第3方命令,表示不同进制数据.这里总结以下表示方法.shell 脚本默认数值是由10 进制数处理,除非这个数字某种特殊的标记法或前缀开头. 才可以表示其它进制类型数值.如:以 0 ...
- 将上传图片转成base64(转)
效果如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"><titl ...
- js转base64(数字)
var name='测试文字'; var t_name=encodeURIComponent(name); t_name=window.btoa(t_name); console.log(t_name ...
- hdu 5237 Base64(模拟)
Base64 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- Base64(3)
public final class Base64 { static private final int BASELENGTH = 128; static private ...
- WebSocket协议探究(一)
一 复习和目标 1 复习 上一节使用wireshark抓包分析了WebSocket流量 包含连接的建立:HTTP协议升级WebSocket协议 使用建立完成的WebSocket协议发送数据 2 目标 ...
- cookie规范(RFC6265)翻译
来源:https://github.com/renaesop/blog/issues/4 RFC 6265 要点翻译 1.简介 本文档定义了HTTP Cookie以及HTTP头的Set-Cookie字 ...
- (iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题
我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法.我记得我在前一个项目中使用的就是这两种加密算法的结合:Bas ...
- Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC
Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC 博客分类: Java/Security Javabase64macmd5sha 加密解密,曾经是我一 ...
随机推荐
- Sleep和 SleepEx函数
Sleep和 SleepEx函数的功能是在指定的执行时间内中止所在线程的执行. SleepEx扩展了Sleep的功能,在最短超时时间间隔已到的情况下恢复线程执行外,在以下两种情况下发生时也可以恢复执行 ...
- Docker存储卷篇
Docker存储卷篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.写时复制(COW)机制 所谓写时复制的效果如上图所示: Docker镜像由多个只读层叠加而成,启动容器 ...
- Linux文本编译工具VIM详解
Linux文本编译工具VIM详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.VIM概述 1>.vim简介 >.vi: 全称Visual editor,即文本编辑 ...
- 一道面试题关于js中逗号
一.今天遇到一个面试题,自我感觉是会,但是却做错了.人都是这样,自我感觉良好,其实也就预警自己已经忽视一些细节以及一些自我感知. 面试题: ,j=,k; ,j<;i++,j++){ k=i+j; ...
- 【Servlet】基于Jsp的微信Oauth2认证
作者:yongh701 挂载到微信服务器上的应用程序,能够通过微信Oauth2认证,能够抓取到用户的微信信息,当然,你首先要通过微信的帐号资质审核. 一.基本思想 二.基本过程 1.登陆微信的公众平台 ...
- 猎豹全球智库执行院长:中国App出海的三大规律和最具代表的五大垂直品类
https://36kr.com/p/5100078 中国出海还是处于一个黄金时代. “国内互联网公司的竞争越来越白热化,出海的时间点变得越来越紧迫,”在36氪日前举办的“WISEx新出海行业峰会”上 ...
- Maven和Ajax
****************使用maven构建项目******************** 一个maven项目必须要有一个pom文件. maven中常用的命令: 在使用mvn archetype: ...
- shell grep的基本用法
grep 1.-i 不区分大写小写 2.-n 区分大小写 3.-E 查找多个条件 4.-c 查找到的结果的行数 5.-w 精确查找 6.取反 7.-q 静默输出
- 数论--扩展欧几里得exgcd
算法思想 我们想求得一组\(x,y\)使得 \(ax+by = \gcd(a,b)\) 根据 \(\gcd(a,b) = \gcd(b,a\bmod b)\) 如果我们现在有\(x',y'\) 使得 ...
- vault 使用 中间ca 进行证书管理
使用vault 进行pki 管理是很方便的,以前测试的都是由根证书进行证书签发,这次使用中间ca 进行签发 所以会有一个证书连 测试使用docker-compose 运行 环境准备 docker-co ...