3

Pythonでこの例を考えると

sample = '5PB37L2CH5DUDWN2SUOYE6LJPYCJBFM5N2FGVEHF7HD224UR52KB===='
a = base64.b32decode(sample)
b = base64.b32encode(a)

なんで

サンプル!= b?

しかしここで

sample = '5PB37L2CH5DUDWN2SUOYE6LJPYCJBFM5N2FGVEHF7HD224UR52KBAAAA'

それから

サンプル==b

4

2 に答える 2

4

そこにある最初のサンプルは無効なbase64です。

ウィキから取得:

エンコードするバイト数が3で割り切れない場合(つまり、最後のブロックに1バイトまたは2バイトの入力しかない場合)、次のアクションが実行されます。値がゼロのバイトを追加して3バイトにします。 、base64への変換を実行します。有効な入力バイトが1つしかない場合は、最初の2つのbase64桁のみが選択され、重要な入力バイトが2つある場合は、最初の3つのbase64桁が選択されます。'='文字を追加して、最後のブロックに4つのbase64文字を含めることができます。

http://en.wikipedia.org/wiki/Base64#Examples

編集:

RFC 4648から取得:


エンコードされるデータの最後で使用可能なビットが24ビット未満の場合、特別な処理が実行されます。フルエンコーディングクォンタムは
、常に数量の最後に完了します。
入力グループで使用可能な入力ビットが24未満の場合、値がゼロのビットが
(右側に)追加され、6ビットグループの整数が形成されます。データの最後のパディング
は、「=」文字を使用して実行されます。

4 x 8ビット(=の)(の最後にあるsample)は24ビットを超えるため、少なくとも不要です。(データ型が何であるかsampleはわかりませんが、サイズ×文字数を24で割った値を調べてください)

あなたの特定についてsample

base-encodingは24ビットチャンクで読み取り、文字列を24ビットチャンクに分割した後に文字列の残りを「サイズ24」にするために、ベースの文字列の最後に「=」のパディング文字のみが必要です。デコーダー。文字列の最後にある====は24ビットを超えるため、役に立たないため、無効です。

于 2012-09-14T00:40:03.197 に答える
1

まず、明確にしましょう。あなたの質問は、base64ではなくbase32に関するものです。

元のサンプルは少し長すぎます。最後に4つ=のパディングがあります。これは、少なくとも20ビットのパディングを意味します。ビット数は8の倍数でなければならないので、実際には24ビットです。Bbase32でのエンコーディングはです1。これは、パディングビットの1つが設定されていることを意味します。これは、すべてのパディングビットをクリアする必要があるという仕様の違反です。デコードはビットを完全にドロップし、エンコードは。Aの代わりに適切な値を生成しますB

于 2012-09-14T01:58:23.010 に答える