1. 什麼是base64
base64是一種使用64個可讀字元的一種編碼方式
64個字元如下:
(a~z)26個小寫字母
(A~Z)26
+:加号
/:斜杠
https://note.youdao.com/md/?defaultMode=view&fileId=0CF67EFDCB2A4E1CADFA920CAC2AA777#2-base64%E5%8E%9F%E7%90%86 2. base64原理
首先說說相關編碼位數:Hex(十六進制)以4位為一組,而base64以6位為一組 這裡的位指的是二進制位
base64将三個字元(3*8位)轉化為4個字元(4*6位),文本不足3個字元,對轉化6位字元後,後面的剩餘的二進制位可能是2位或者4位(因為8X/6餘數為2或者4),然後進行補0(補到一共6位,因為base64是以6位為機關)。最後還需加=号,缺少2個二進制位就補一個=号,缺少4個就補充兩個==。沒有了解的多看看下面的例子。
具體對于轉換後餘幾位情況轉換如下(這裡主要針對英文,中文轉換具體得看中文編碼):
https://note.youdao.com/md/?defaultMode=view&fileId=0CF67EFDCB2A4E1CADFA920CAC2AA777#1%E4%B8%8D%E9%9C%80%E8%A6%81%E8%A1%A5%E4%BD%8D1.不需要補位
原文: p h p
對應ASCII: 01110000 01101000 01110000
每6位分割: 011100 000110 100001 110000 |
對應10進制值: 28 6 33 48
Base64對應的字元:c G h w
最後php=cGhw(base64)
https://note.youdao.com/md/?defaultMode=view&fileId=0CF67EFDCB2A4E1CADFA920CAC2AA777#2%E9%9C%80%E8%A6%81%E8%A1%A5%E5%85%85%E5%9B%9B%E4%B8%AA%E4%BA%8C%E8%BF%9B%E5%88%B6%E4%BD%8D2.需要補充四個二進制位
原文: r a n l
ASCII值:01110010 01100001 01101110 01101100
每6位分割:011100 100110 000101 101110 | 011011 00 0000 xxxxxx xxxxxx |
對應10進制值:28 38 5 46 27 0 = = 對應base64字元: c m F u b A = =
結果: ranl=cmFubA==(base64)
https://note.youdao.com/md/?defaultMode=view&fileId=0CF67EFDCB2A4E1CADFA920CAC2AA777#3%E9%9C%80%E8%A6%81%E8%A1%A5%E5%85%85%E4%B8%A4%E4%B8%AA%E4%BA%8C%E8%BF%9B%E5%88%B6%E4%BD%8D3.需要補充兩個二進制位
原文 h a c k e
ASCII值: 01101000 01100001 01100011 01101011 01100101
每6位分割: 011010 000110 000101 100011 | 011010 110110 0101 00 xxxxxx |
對應10進制值: 26 6 5 35 26 54 20 =
對應base64字元: a G F j a 2 U =
結果 hacke=aGFja2U=(base64)
https://note.youdao.com/md/?defaultMode=view&fileId=0CF67EFDCB2A4E1CADFA920CAC2AA777#3-base64%E5%B8%B8%E8%A7%81%E7%94%A8%E9%80%94 3. base64常見用途
1.傳輸不可見字元(128~255)不友善,容易出錯。這裡的不可見字元是正對ascii碼(0~127)
2.web傳輸小圖檔(圖檔上傳與圖檔顯示):利用浏覽器直接解析base64或使用js解析,避免多次請求。格式如下
2.1web背景生成/解析字元串
(1):圖檔生成base64字元串 byte[] data = null;
// 讀取圖檔位元組數組
try {
InputStream in = new FileInputStream(imgFilePath);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// 對位元組數組Base64編碼
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);// 傳回Base64編碼過的位元組數組字元串
(2):解析
// 對位元組數組Base64解碼
if (imgStr == null) // 圖像資料為空
return false;
BASE64Decoder decoder = new BASE64Decoder();
try {
// Base64解碼
byte[] bytes = decoder.decodeBuffer(imgStr);
for (int i = 0; i < bytes.length; ++i) {
if (bytes[i] < 0) {// 調整異常資料
bytes[i] += 256;
}
}
// 生成jpeg圖檔
OutputStream out = new FileOutputStream(imgFilePath);
out.write(bytes);
out.flush();
out.close();
return true;
} catch (Exception e) {
return false;
}
}
附屬圖檔:
參考文章: