📄 base64util.java
字号:
/*
* 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -