2012-07-19 70 views
4

我正在閱讀此libb64用於編碼和解碼base64數據的源代碼。base64的解碼錶構造

我知道編碼過程,但我無法弄清楚如何構建下面的解碼錶以快速查找來執行編碼的base64字符的解碼。這是他們正在使用的表格:

static const char decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51}; 

有人可以解釋我如何使用此表中的值來解碼目的。

+1

微點:有些文體的不使用符號整數,而無需指定'簽署char'。 – unwind 2012-07-19 10:59:55

回答

5

這是一個移位和有限的ASCII翻譯表。該表的鍵是ASCII值,這些值是base64解碼值。該表被移位,使得索引0實際映射到ASCII字符+,並且任何其他索引映射+之後的ASCII值。表中的第一個條目(ASCII字符+)映射到base64值62。然後忽略三個字符(ASCII ,-.),下一個字符映射到base64值63。下一個字符是ASCII /

如果你看看那張表和ASCII table,其餘部分會變得很明顯。

它的使用是這樣的:

int decode_base64(char ch) { 
    if (ch < `+` or ch > `z`) { 
     return SOME_INVALID_CH_ERROR; 
    } 

    /* shift range into decoding table range */ 
    ch -= `+`; 

    int base64_val = decoding[ch]; 

    if (base64_val < 0) { 
     return SOME_INVALID_CH_ERROR; 
    } 

    return base64_val; 
} 
5

正如所知,每個字節具有8個比特,可能256種組合使用2個符號(BASE2)。
用2個符號需要浪費8個字符來表示一個字節,例如'01010011'。
隨着基座64能夠表示64種組合被1個炭...
因此,我們有一個基本表:
A = 000000
B = 000001
C = 000010
...
如果你所說的 '人',讓你有個字節:
01001101,01100001,01101110
等流:010011 010110 000101 101110:在六位組

歇3210 010011 = T
010110 = W
000101 = F
101110 = U
所以, '人'=>的base64編碼= 'TWFu'。
正如所看到的,這完美地適用於長度爲6倍的流。

如果你有一個流是不是6倍數,例如「馬」你有流:
你需要完成的有6組:
讓你有編碼底座64:
010011 = T
010110 = W
000100 = E
所以, '馬'=> 'TWE'

後的流進行解碼,在這種情況下,需要calc下最後倍數長度是多個8等刪除多餘的比特,以獲得原始流:
T = 010011
W = 010110
E = 000100
1)010011 010110 000100
2)01001101 01100001 00
3)01001101 01100001 = '馬'
在真,當我們把尾部00年代,我們標記的Base64字符串的結束與 '=' 到每個尾部'00('Ma'==> Base64'TWE =')


查看該鏈接:http://www.base64decode.org/


基於64位的圖像是一個很好的選擇,可以用很多應用程序中的字符串表示,但很難直接使用真正的二進制流。真正的二進制流是更好的,因爲它是base256,但在HTML內部很困難,例如有2種方式,小流量,或者更容易使用字符串。

見ASCII碼太,基部64的字符是從範圍「+」到上表ASCII「Z」,但有「+」和「Z」是不基座64個符號之間的某些值


'+'= DEC從ASCII DEC 43
...
'Z'= DEC ASCII 122
43至122 80倍的值,但
43行= '+'
44 ISN」 t基數64個符號,所以解碼索引是-1(無效符號到base64)
45 ....
46 ...
...
122 OK = 'Z'
做解碼所需要的炭,遞減的43( '+')是在載體中以快速索引0按索引訪問so,解碼[80] = {62,-1,-1 ........,49,50,51};


羅伯託Novakosky
開發者系統