2016-04-04 11 views
-1

このコードは、base64文字列をデコードする実装です。コードのビット操作部分について説明してください。コードのビット操作部分を説明してください

frombase64(s): \\base64_decode 
b64s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/" 
b64p = "=" 
ret = "" 
s2 = s.replace(b64p, "") 
left = 0 
for i in range(0, len(s2)): 
    if left == 0: 
     left = 6 
    else: 
     value1 = b64s.index(s2[i - 1]) & (2 ** left - 1) 
     value2 = b64s.index(s2[i]) >> (left - 2) 
     value = (value1 << (8 - left)) | value2 
     ret += chr(value) 
     left -= 2 
return ret 

は私がprogramming.Iに新しいビットは理解していないよ、なぜ変数値1、値2、値上で行われる操作。私はこれらの操作がbase64でエンコードされた文字列をテキストに変換する方法を知りたい。私はこれをhereから取った。

ここで私の質問は「コードのelse部分で何が起こっているのですか?

+2

あなたの*具体的な質問がここにあることを明確にすることはできますか?それが立っているので、私はそれがスタックオーバーフローに適しているとは思わない。 – BlackVegetable

+0

変数value1、value2、valueに対して行われた操作を理解できませんでした。 プログラムの目的は、base64でエンコードされた文字列をデコードすることです。 – papabiceps

答えて

1

あなたが何をするか、コードを知りたい場合は、それはNB (2 ** left - 1)((1<<left)-1)可能性があり、あなたに

b64s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/" 
b64p = "=" 
ret = "" 
s2 = """TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=""".replace(b64p, "") 
left = 0 
for i in range(0, len(s2)): 
    if left == 0: 
     left = 6 
    else: 
     value1 = b64s.index(s2[i - 1]) & (2 ** left - 1) 
     value2 = b64s.index(s2[i]) >> (left - 2) 
     value = (value1 << (8 - left)) | value2 
     print(left, chr(value), bin(ord(s2[i-1])).rjust(10), bin(ord(s2[i])).rjust(10), bin(value1).rjust(10), bin(value2).rjust(10), bin(value).rjust(10)) 
     ret += chr(value) 
     left -= 2 
print(ret) 

を伝えています。これは我々がs2[i-1]からいくつかの右端のビットをしたいビットマスク(左= 3、その後、0111は結果のバイナリである)

は、s2[i]の残りのビットはで使用されるのs2[i]からいくつかの一番左のビット、それらを組み合わせただろう次の繰り返し

あなたのコメントに応じて、各文字は8ビットではなく6ビットを表します。したがって、8ビットを表すには2文字を組み合わせる必要があります。左 - = 2は8-6が2であるためです。各文字が4ビットの場合、左に4を設定します。&は4を減算し、左に== 0トリガーを2回繰り返します。各文字のペアは正確に1バイトにマップされるためです。左右にスライドする量が8になっているだけです。各ビットを1回だけ読み込む必要があるため、スライディングが繰り返されるたびにビットインデックスをスライドさせて読む必要があります。ビット値をインデックスするiの一部として残っていると想像してみてください。左に0をつけると、現在の文字からすべて6を取る必要があります。& 2から次は、なぜ左に6を設定するのですか?&次の文字に進む次の文字に進む& 2最後の反復から6を取った)

+0

プログラムの内容を説明できますか?私は、base64でエンコードされた文字列をテキストに変換する方法を意味します。 – papabiceps

+0

コメントの長さを超えて私の答えを更新しました –

+0

ありがとうございました。 – papabiceps

関連する問題