package
com.duanlian.daimengmusic.utils;
public
final
class
Base64Util {
private
static
final
int
BASELENGTH =
128
;
private
static
final
int
LOOKUPLENGTH =
64
;
private
static
final
int
TWENTYFOURBITGROUP =
24
;
private
static
final
int
EIGHTBIT =
8
;
private
static
final
int
SIXTEENBIT =
16
;
private
static
final
int
FOURBYTE =
4
;
private
static
final
int
SIGN = -
128
;
private
static
char
PAD =
‘=‘
;
private
static
byte
[] base64Alphabet =
new
byte
[BASELENGTH];
private
static
char
[] lookUpBase64Alphabet =
new
char
[LOOKUPLENGTH];
static
{
for
(
int
i =
0
; i < BASELENGTH; ++i) {
base64Alphabet[i] = -
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] = (
char
) (
‘A‘
+ i);
}
for
(
int
i =
26
, j =
0
; i <=
51
; i++, j++) {
lookUpBase64Alphabet[i] = (
char
) (
‘a‘
+ j);
}
for
(
int
i =
52
, j =
0
; i <=
61
; i++, j++) {
lookUpBase64Alphabet[i] = (
char
) (
‘0‘
+ j);
}
lookUpBase64Alphabet[
62
] = (
char
)
‘+‘
;
lookUpBase64Alphabet[
63
] = (
char
)
‘/‘
;
}
private
static
boolean
isWhiteSpace(
char
octect) {
return
(octect ==
0x20
|| octect ==
0xd
|| octect ==
0xa
|| octect ==
0x9
);
}
private
static
boolean
isPad(
char
octect) {
return
(octect == PAD);
}
private
static
boolean
isData(
char
octect) {
return
(octect < BASELENGTH && base64Alphabet[octect] != -
1
);
}
/**
把64位byte数组转换成String
*/
public
static
String encode(
byte
[] binaryData) {
if
(binaryData ==
null
) {
return
null
;
}
int
lengthDataBits = binaryData.length * EIGHTBIT;
if
(lengthDataBits ==
0
) {
return
""
;
}
int
fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
int
numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
int
numberQuartet = fewerThan24bits !=
0
? numberTriplets +
1
: numberTriplets;
char
encodedData[] =
null
;
encodedData =
new
char
[numberQuartet *
4
];
byte
k =
0
, l =
0
, b1 =
0
, b2 =
0
, b3 =
0
;
int
encodedIndex =
0
;
int
dataIndex =
0
;
for
(
int
i =
0
; i < numberTriplets; i++) {
b1 = binaryData[dataIndex++];
b2 = binaryData[dataIndex++];
b3 = binaryData[dataIndex++];
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
);
byte
val3 = ((b3 & SIGN) ==
0
) ? (
byte
) (b3 >>
6
)
: (
byte
) ((b3) >>
6
^
0xfc
);
encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k <<
4
)];
encodedData[encodedIndex++] = lookUpBase64Alphabet[(l <<
2
) | val3];
encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 &
0x3f
];
}
// form integral number of 6-bit groups
if
(fewerThan24bits == EIGHTBIT) {
b1 = binaryData[dataIndex];
k = (
byte
) (b1 &
0x03
);
byte
val1 = ((b1 & SIGN) ==
0
) ? (
byte
) (b1 >>
2
)
: (
byte
) ((b1) >>
2
^
0xc0
);
encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex++] = lookUpBase64Alphabet[k <<
4
];
encodedData[encodedIndex++] = PAD;
encodedData[encodedIndex++] = PAD;
}
else
if
(fewerThan24bits == SIXTEENBIT) {
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++] = lookUpBase64Alphabet[val2 | (k <<
4
)];
encodedData[encodedIndex++] = lookUpBase64Alphabet[l <<
2
];
encodedData[encodedIndex++] = PAD;
}
return
new
String(encodedData);
}
/**
* 把Base64位编码转换成byte数组
*/
public
static
byte
[] decode(String encoded) {
if
(encoded ==
null
) {
return
null
;
}
char
[] base64Data = encoded.toCharArray();
// remove white spaces
int
len = removeWhiteSpace(base64Data);
if
(len % FOURBYTE !=
0
) {
return
null
;
// should be divisible by four
}
int
numberQuadruple = (len / FOURBYTE);
if
(numberQuadruple ==
0
) {
return
new
byte
[
0
];
}
byte
decodedData[] =
null
;
byte
b1 =
0
, b2 =
0
, b3 =
0
, b4 =
0
;
char
d1 =
0
, d2 =
0
, d3 =
0
, d4 =
0
;
int
i =
0
;
int
encodedIndex =
0
;
int
dataIndex =
0
;
decodedData =
new
byte
[(numberQuadruple) *
3
];
for
(; i < numberQuadruple -
1
; i++) {
if
(!isData((d1 = base64Data[dataIndex++]))
|| !isData((d2 = base64Data[dataIndex++]))
|| !isData((d3 = base64Data[dataIndex++]))
|| !isData((d4 = base64Data[dataIndex++]))) {
return
null
;
}
// if found "no data" just return null
b1 = base64Alphabet[d1];
b2 = base64Alphabet[d2];
b3 = base64Alphabet[d3];
b4 = base64Alphabet[d4];
decodedData[encodedIndex++] = (
byte
) (b1 <<
2
| b2 >>
4
);
decodedData[encodedIndex++] = (
byte
) (((b2 &
0xf
) <<
4
) | ((b3 >>
2
) &
0xf
));
decodedData[encodedIndex++] = (
byte
) (b3 <<
6
| b4);
}
if
(!isData((d1 = base64Data[dataIndex++]))
|| !isData((d2 = base64Data[dataIndex++]))) {
return
null
;
// if found "no data" just return null
}
b1 = base64Alphabet[d1];
b2 = base64Alphabet[d2];
d3 = base64Data[dataIndex++];
d4 = base64Data[dataIndex++];
if
(!isData((d3)) || !isData((d4))) {
// Check if they are PAD characters
if
(isPad(d3) && isPad(d4)) {
if
((b2 &
0xf
) !=
0
)
// last 4 bits should be zero
{
return
null
;
}
byte
[] tmp =
new
byte
[i *
3
+
1
];
System.arraycopy(decodedData,
0
, tmp,
0
, i *
3
);
tmp[encodedIndex] = (
byte
) (b1 <<
2
| b2 >>
4
);
return
tmp;
}
else
if
(!isPad(d3) && isPad(d4)) {
b3 = base64Alphabet[d3];
if
((b3 &
0x3
) !=
0
)
// last 2 bits should be zero
{
return
null
;
}
byte
[] tmp =
new
byte
[i *
3
+
2
];
System.arraycopy(decodedData,
0
, tmp,
0
, i *
3
);
tmp[encodedIndex++] = (
byte
) (b1 <<
2
| b2 >>
4
);
tmp[encodedIndex] = (
byte
) (((b2 &
0xf
) <<
4
) | ((b3 >>
2
) &
0xf
));
return
tmp;
}
else
{
return
null
;
}
}
else
{
// No PAD e.g 3cQl
b3 = base64Alphabet[d3];
b4 = base64Alphabet[d4];
decodedData[encodedIndex++] = (
byte
) (b1 <<
2
| b2 >>
4
);
decodedData[encodedIndex++] = (
byte
) (((b2 &
0xf
) <<
4
) | ((b3 >>
2
) &
0xf
));
decodedData[encodedIndex++] = (
byte
) (b3 <<
6
| b4);
}
return
decodedData;
}
/**
* remove WhiteSpace from MIME containing encoded Base64Util data.
*
* @param data
* the byte array of base64 data (with WS)
* @return the new length
*/
private
static
int
removeWhiteSpace(
char
[] data) {
if
(data ==
null
) {
return
0
;
}
// count characters that‘s not whitespace
int
newSize =
0
;
int
len = data.length;
for
(
int
i =
0
; i < len; i++) {
if
(!isWhiteSpace(data[i])) {
data[newSize++] = data[i];
}
}
return
newSize;
}
}
然后是我经过2次封装的类,注释很清楚,拿过去直接用就行
package
com.duanlian.daimengmusic.utils;
import
android.graphics.Bitmap;
import
android.graphics.BitmapFactory;
import
android.util.Base64;
import
java.io.ByteArrayOutputStream;
import
java.io.IOException;
/**
* 转换编码
*/
public
class
Base64Object {
/**
* 把base64的String码转换成正常显示的字符串
*/
public
static
String base64ToString(String base64) {
byte
[] decode = Base64Util.decode(base64);
String s =
new
String(decode);
return
s;
}
/**
* 把String的转换成base64码
*/
public
static
String stringToBase64(String ss) {
byte
[] bytes = ss.getBytes();
String encode = Base64Util.encode(bytes);
return
encode;
}
/**
* bitmap转为base64
* @param bitmap
* @return
*/
public
static
String bitmapToBase641(Bitmap bitmap) {
String result =
null
;
ByteArrayOutputStream baos =
null
;
try
{
if
(bitmap !=
null
) {
baos =
new
ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG,
100
, baos);
baos.flush();
baos.close();
byte
[] bitmapBytes = baos.toByteArray();
result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT);
}
}
catch
(IOException e) {
e.printStackTrace();
}
finally
{
try
{
if
(baos !=
null
) {
baos.flush();
baos.close();
}
}
catch
(IOException e) {
e.printStackTrace();
}
}
return
result;
}
/**
* base64转为bitmap
* @param base64Data
* @return
*/
public
static
Bitmap base64ToBitmap(String base64Data) {
byte
[] bytes = Base64.decode(base64Data, Base64.DEFAULT);
return
BitmapFactory.decodeByteArray(bytes,
0
, bytes.length);
}
}
以上所述是小编给大家介绍的Java Base64位编码与String字符串的相互转换,Base64与Bitmap的相互转换实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!