base64util.java

来自「这是一个轻便的j2ee的web应用框架,是一个在多个项目中运用的实际框架,采用s」· Java 代码 · 共 161 行

JAVA
161
字号
/*
 * Created on 2004-5-11
 *
 */
package com.esimple.service.crypto.util;

/**
 * @author steven
 *
 */
public class BASE64Util {
	private static final int LOWER_CASE_A_VALUE = 26;
	private static final int ZERO_VALUE = 52;
	private static final int PLUS_VALUE = 62;
	private static final int SLASH_VALUE = 63;
	private static final int SIX_BIT_MASK = 63;
	private static final int EIGHT_BIT_MASK = 255;

	public static String encode(byte data[]) {
		int charCount = (data.length * 4) / 3 + 4;
		StringBuffer result = new StringBuffer((charCount * 77) / 76);
		int byteArrayLength = data.length;
		int byteArrayIndex = 0;
		int byteTriplet = 0;
		while (byteArrayIndex < byteArrayLength - 2) {
			byteTriplet = CharUtil.convertUnsignedByteToInt(data[byteArrayIndex++]);
			byteTriplet <<= 8;
			byteTriplet |= CharUtil.convertUnsignedByteToInt(data[byteArrayIndex++]);
			byteTriplet <<= 8;
			byteTriplet |= CharUtil.convertUnsignedByteToInt(data[byteArrayIndex++]);
			byte b4 = (byte) (0x3f & byteTriplet);
			byteTriplet >>= 6;
			byte b3 = (byte) (0x3f & byteTriplet);
			byteTriplet >>= 6;
			byte b2 = (byte) (0x3f & byteTriplet);
			byteTriplet >>= 6;
			byte b1 = (byte) (0x3f & byteTriplet);
			result.append(CharUtil.mapByteToChar(b1));
			result.append(CharUtil.mapByteToChar(b2));
			result.append(CharUtil.mapByteToChar(b3));
			result.append(CharUtil.mapByteToChar(b4));
			if (byteArrayIndex % 57 == 0)
				result.append("\n");
		}
		if (byteArrayIndex == byteArrayLength - 1) {
			byteTriplet = CharUtil.convertUnsignedByteToInt(data[byteArrayIndex++]);
			byteTriplet <<= 4;
			byte b2 = (byte) (0x3f & byteTriplet);
			byteTriplet >>= 6;
			byte b1 = (byte) (0x3f & byteTriplet);
			result.append(CharUtil.mapByteToChar(b1));
			result.append(CharUtil.mapByteToChar(b2));
			result.append("==");
		}
		if (byteArrayIndex == byteArrayLength - 2) {
			byteTriplet = CharUtil.convertUnsignedByteToInt(data[byteArrayIndex++]);
			byteTriplet <<= 8;
			byteTriplet |= CharUtil.convertUnsignedByteToInt(data[byteArrayIndex++]);
			byteTriplet <<= 2;
			byte b3 = (byte) (0x3f & byteTriplet);
			byteTriplet >>= 6;
			byte b2 = (byte) (0x3f & byteTriplet);
			byteTriplet >>= 6;
			byte b1 = (byte) (0x3f & byteTriplet);
			result.append(CharUtil.mapByteToChar(b1));
			result.append(CharUtil.mapByteToChar(b2));
			result.append(CharUtil.mapByteToChar(b3));
			result.append("=");
		}
		return result.toString();
	}




	public static byte[] decodeBuffer(String data) {
		StringWrapper wrapper = new StringWrapper(data);
		int byteArrayLength = (wrapper.getUsefulLength() * 3) / 4;
		byte result[] = new byte[byteArrayLength];
		int byteTriplet = 0;
		int byteIndex;
		for (byteIndex = 0; byteIndex + 2 < byteArrayLength; byteIndex += 3) {
			byteTriplet = CharUtil.mapCharToInt(wrapper.getNextUsefulChar());
			byteTriplet <<= 6;
			byteTriplet |= CharUtil.mapCharToInt(wrapper.getNextUsefulChar());
			byteTriplet <<= 6;
			byteTriplet |= CharUtil.mapCharToInt(wrapper.getNextUsefulChar());
			byteTriplet <<= 6;
			byteTriplet |= CharUtil.mapCharToInt(wrapper.getNextUsefulChar());
			result[byteIndex + 2] = (byte) (byteTriplet & 0xff);
			byteTriplet >>= 8;
			result[byteIndex + 1] = (byte) (byteTriplet & 0xff);
			byteTriplet >>= 8;
			result[byteIndex] = (byte) (byteTriplet & 0xff);
		}

		if (byteIndex == byteArrayLength - 1) {
			byteTriplet = CharUtil.mapCharToInt(wrapper.getNextUsefulChar());
			byteTriplet <<= 6;
			byteTriplet |= CharUtil.mapCharToInt(wrapper.getNextUsefulChar());
			byteTriplet >>= 4;
			result[byteIndex] = (byte) (byteTriplet & 0xff);
		}
		if (byteIndex == byteArrayLength - 2) {
			byteTriplet = CharUtil.mapCharToInt(wrapper.getNextUsefulChar());
			byteTriplet <<= 6;
			byteTriplet |= CharUtil.mapCharToInt(wrapper.getNextUsefulChar());
			byteTriplet <<= 6;
			byteTriplet |= CharUtil.mapCharToInt(wrapper.getNextUsefulChar());
			byteTriplet >>= 2;
			result[byteIndex + 1] = (byte) (byteTriplet & 0xff);
			byteTriplet >>= 8;
			result[byteIndex] = (byte) (byteTriplet & 0xff);
		}
		return result;
	}



	private static class StringWrapper {

		private String mString;
		private int mIndex;
		private int mUsefulLength;

		private boolean isUsefulChar(char c) {
			return c >= 'A'
				&& c <= 'Z'
				|| c >= 'a'
				&& c <= 'z'
				|| c >= '0'
				&& c <= '9'
				|| c == '+'
				|| c == '/';
		}

		public int getUsefulLength() {
			return mUsefulLength;
		}

		public char getNextUsefulChar() {
			char result;
			for (result = '_';
				!isUsefulChar(result);
				result = mString.charAt(mIndex++));
			return result;
		}

		public StringWrapper(String s) {
			mIndex = 0;
			mString = s;
			mUsefulLength = 0;
			int length = mString.length();
			for (int i = 0; i < length; i++)
				if (isUsefulChar(mString.charAt(i)))
					mUsefulLength++;

		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?