天天看點

Base64初探

1. 什麼是base64

base64是一種使用64個可讀字元的一種編碼方式
  64個字元如下:
   (a~z)26個小寫字母
   (A~Z)26
   +:加号
   /:斜杠      
Base64初探

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%8D

1.不需要補位

原文: 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%8D

2.需要補充四個二進制位

原文: 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%8D

3.需要補充兩個二進制位

原文 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;
    }
}      

附屬圖檔:

Base64初探

參考文章: