5

base64データのエンコードとデコードのために、このlibb64ソースコードを読んでいます。

エンコード手順は知っていますが、エンコードされた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};

このテーブルの値がデコード目的でどのように使用されるかを説明してもらえますか?

4

3 に答える 3

6

これは、シフトされ制限された ASCII 変換テーブルです。テーブルのキーは ASCII 値で、値は base64 でデコードされた値です。0テーブルは、インデックスが実際に ASCII 文字にマップされ、+それ以降のインデックスが の後の ASCII 値にマップされるようにシフトされ+ます。テーブルの最初のエントリである ASCII 文字+は、base64 値にマップされます62。次に、3 文字が無視され (ASCII ,-.)、次の文字が base64 値にマップされます63。その次の文字は ASCII/です。

その表とASCII 表を見れば、あとは明らかです。

その使用法は次のようなものです。

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;
}
于 2012-07-19T10:57:16.277 に答える
5

ご存知のように、各バイトには 8 ビットがあり、2 つのシンボル (base2) で 256 通りの組み合わせが可能です。
2 つのシンボルでは、1 バイトを表すために 8 文字を無駄にする必要があります (例: '01010011')。
ベース 64 を使用すると、1 文字で 64 の組み合わせを表すことができます... したがって 、 ベース
テーブルがあり ます 。 01001101, 01100001, 01101110 などのストリーム: 011010110000101101110 6 ビットのグループを分割: 010011 010110 000101 101110 010011 = T 010110 = W 000101 > F 'F 'F 'F ' F 101110 =















ご覧のとおり、これは長さが 6 の倍数のストリームに対して完全に機能します。

6 の倍数ではないストリームがある場合、たとえば 'Ma' の場合、stream:
010011 010110 0001
があり、6 のグループを持つために完了する必要がある:
010011 010110 000100 したがって
、コード化されたベース 64:
010011 = Tが得られます。
010110 = W 000100
= E
したがって、'Ma' => 'TWE'

ストリームをデコードした後、この場合、最後の倍数の長さが 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/


base 64 で表現された画像は、実際のバイナリ ストリームを直接操作することが難しい多くのアプリケーションで文字列を表現するのに適したオプションです。実際のバイナリ ストリームは base256 であるためより優れていますが、HTML 内では困難です。

ASCII コードも参照してください。base 64 の文字はテーブル ASCII の範囲 '+' から 'z' ですが、base 64 シンボルではない '+' と 'z' の間にいくつかの値があります


'+' = ASCII DEC 43
...
'z' = ASCII DEC 122
DEC 43 から 122 までは 80 の値ですが、
43 OK = '+'
44 は base 64 シンボルではないため、デコード インデックスは -1 (base64 への無効なシンボル)
45 ... .
46 ...
...
122 OK = 'z'
デコードに必要な char を実行し、43 ('+') をデクリメントしてベクトルのインデックス 0 にし、インデックスですばやくアクセスするため、decoding[80] = {62, -1, -1 ........, 49, 50,51};


ロベルト ノバコスキー
デベロッパー システムズ

于 2013-06-15T03:33:03.787 に答える
0

これらの 2 つのマッピング テーブルを考慮すると、次のようになります。

static const char decodingTab[] = {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};
static unsigned char encodingTab[64]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

decodeTab は、encondingTab の逆マッピング テーブルです。したがって、decodingTab[i] が -1 になることはありません。実際、期待される値は 64 個だけです。ただし、decodingTab のサイズは 128 です。そのため、decodingTab では、予期しないインデックス値が -1 ([0,63] にない任意の数値) に設定されます。

char c;
unsigned char i;
...
encoding[decoding[c]]=c;
decoding[encoding[i]=i;

それが役に立てば幸い。

于 2019-01-11T17:38:24.397 に答える