2012-07-19 66 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
开发者系统