Base编码系列
Base編碼系列: Base64 Base32 Base16
我們以Base編碼為例。
Base64編碼是使用64個(gè)可打印的ASCII字符(A-Z、a-z、0-9、+、/)將任意字節(jié)序列數(shù)據(jù)編碼成ASCII字符串。另有"="符號(hào)用作后綴用途。
Base64將輸入字符串按字節(jié)切分,取得每個(gè)字節(jié)對(duì)應(yīng)的二進(jìn)制值(若不足8比特則高位補(bǔ)0),然后將這些二進(jìn)制數(shù)值串聯(lián)起來(lái),再按照6比特一組進(jìn)行切分(因?yàn)?^6=64),最后一組若不足6比特則末尾補(bǔ)0。將每組二進(jìn)制值轉(zhuǎn)換成十進(jìn)制,然后在上述表格中找到對(duì)應(yīng)的符號(hào)并串聯(lián)起來(lái)就是Base64編碼結(jié)果。
由于二進(jìn)制數(shù)據(jù)是按照8比特一組進(jìn)行傳輸,因此Base64按照6比特一組切分的二進(jìn)制數(shù)據(jù)必須是24比特的倍數(shù)(6和8的最小公倍數(shù))。24比特就是3個(gè)字節(jié),若原字節(jié)序列數(shù)據(jù)長(zhǎng)度不是3的倍數(shù)時(shí)且剩下1個(gè)輸入數(shù)據(jù),則在編碼結(jié)果后加2個(gè)=;若剩下2個(gè)輸入數(shù)據(jù),則在編碼結(jié)果后加1個(gè)=。
完整的Base64定義可見(jiàn)RFC1421和RFC2045。因?yàn)锽ase64算法是將3個(gè)字節(jié)原數(shù)據(jù)編碼為4個(gè)字節(jié)新數(shù)據(jù),所以Base64編碼后的數(shù)據(jù)比原始數(shù)據(jù)略長(zhǎng),為原來(lái)的4/3。在電子郵件中,根據(jù)RFC822規(guī)定,每76個(gè)字符,還需要加上一個(gè)回車(chē)換行。可以估算編碼后數(shù)據(jù)長(zhǎng)度大約為原長(zhǎng)的135.1%。
Base64可用于任意數(shù)據(jù)的底層二進(jìn)制數(shù)據(jù)編碼,以應(yīng)用于只能傳輸ASCII字符的場(chǎng)合。不過(guò)最常用于文本數(shù)據(jù)的處理傳輸,例如在MIME格式的電子郵件中,Base64可以用來(lái)編碼郵件內(nèi)容,方便在不同語(yǔ)言計(jì)算機(jī)間傳輸而不亂碼,注意是傳輸而不是顯示,例如在西歐地區(qū)計(jì)算機(jī)上使用utf-8編碼即可正常顯示中文(安裝有對(duì)應(yīng)字庫(kù)),但是它未必能正常傳輸中文,這時(shí)轉(zhuǎn)換為Base64便無(wú)此顧慮。
Base64編碼若無(wú)特別說(shuō)明,通常約定非ASCII字符按照UTF-8字符集進(jìn)行編碼處理。
總結(jié)
- 上一篇: 求圆面积 输出精度要求
- 下一篇: Modern Robotics读书笔记(