2012-01-02 9 views
6

目的:例 バイナリをバイナリに変換すると、辞書より優れていますか?

文字列にバイナリ変換:0111010001100101011100110111010001100011011011110110010001100101 - 私は辞書と私の機能を使用します(スペースなし)> testCode

、私はより良い方法を検索し、より効率的な

from textwrap import wrap 

DICO = {'\x00': '00', '\x04': '0100', '\x08': '01000', '\x0c': '01100', 
'\x10': '010000', '\x14': '010100', '\x18': '011000', '\x1c': '011100', 
' ': '0100000', '$': '0100100', '(': '0101000', ',': '0101100', '0': '0110000', 
'4': '0110100', '8': '0111000', '<': '0111100', '@': '01000000', 
'D': '01000100', 'H': '01001000', 'L': '01001100', 'P': '01010000', 
'T': '01010100', 'X': '01011000', '\\': '01011100', '`': '01100000', 
'd': '01100100', 'h': '01101000', 'l': '01101100', 'p': '01110000', 
't': '01110100', 'x': '01111000', '|': '01111100', '\x03': '011', 
'\x07': '0111', '\x0b': '01011', '\x0f': '01111', '\x13': '010011', 
'\x17': '010111', '\x1b': '011011', '\x1f': '011111', '#': '0100011', 
"'": '0100111', '+': '0101011', '/': '0101111', '3': '0110011', '7': '0110111', 
';': '0111011', '?': '0111111', 'C': '01000011', 'G': '01000111', 
'K': '01001011', 'O': '01001111', 'S': '01010011', 'W': '01010111', 
'[': '01011011', '_': '01011111', 'c': '01100011', 'g': '01100111', 
'k': '01101011', 'o': '01101111', 's': '01110011', 'w': '01110111', 
'{': '01111011', '\x7f': '01111111', '\x02': '010', '\x06': '0110', 
'\n': '01010', '\x0e': '01110', '\x12': '010010', '\x16': '010110', 
'\x1a': '011010', '\x1e': '011110', '"': '0100010', '&': '0100110', 
'*': '0101010', '.': '0101110', '2': '0110010', '6': '0110110', ':': '0111010', 
'>': '0111110', 'B': '01000010', 'F': '01000110', 'J': '01001010', 
'N': '01001110', 'R': '01010010', 'V': '01010110', 'Z': '01011010', 
'^': '01011110', 'b': '01100010', 'f': '01100110', 'j': '01101010', 
'n': '01101110', 'r': '01110010', 'v': '01110110', 'z': '01111010', 
'~': '01111110', '\x01': '01', '\x05': '0101', '\t': '01001', '\r': '01101', 
'\x11': '010001', '\x15': '010101', '\x19': '011001', '\x1d': '011101', 
'!': '0100001', '%': '0100101', ')': '0101001', '-': '0101101', 
'1': '0110001', '5': '0110101', '9': '0111001', '=': '0111101', 
'A': '01000001', 'E': '01000101', 'I': '01001001', 'M': '01001101', 
'Q': '01010001', 'U': '01010101', 'Y': '01011001', ']': '01011101', 
'a': '01100001', 'e': '01100101', 'i': '01101001', 'm': '01101101', 
'q': '01110001', 'u': '01110101', 'y': '01111001', '}': '01111101'} 

def decrypt(binary): 
    """Function to convert binary into string""" 
    binary = wrap(binary, 8) 
    ch = '' 
    for b in binary: 
     for i, j in DICO.items(): 
      if j == b: 
       ch += i 
    return ch 

感謝

+1

正確に改善したいのですか?スペースや時間の複雑さ?現在どのアルゴリズムを使用していますか?文字列を分割しますか? – RedX

+6

シーケンス '010001'が '0100'(=' \ x04')の後に '01'シーケンスの開始が続くのか、ハッシュマーク文字' 0100011'の開始かどうかをどうやって決めるのですか?すべての文字が同じビット数(7ビットまたは8ビットと仮定)の場合、 '\ x00'のコードはあなたの例では' 00000000'と書かれていますが、なぜ '00'ですか?例のデータは解釈の余地がたくさん残っています... – hochl

+0

@Redx、あなたの応答に感謝、私は実行のよりよい時を探します、他に私は私のコードを保ちます – Fred

答えて

2

あなたは一時リストに

を作成するために回避ハタがここ http://docs.python.org/library/itertools.html#recipes

または

def decrypt2(binary): 
    """Function to convert binary into string""" 
    return ''.join((DICO_INVERTED[p] for p in grouper(8,binary,''))) 

から取られ

def decrypt(binary): 
    """Function to convert binary into string""" 
    return ''.join((chr(int(p, 2)) for p in grouper(8,binary,''))) 

を試してみました

EDIT 私が「正しい」答えに選ばれたので、私は他の答えを使用したことを告白する必要があります。ここでのポイントはジェネレータリストを使用しないで、ジェネレータの式とイテレータです

+0

非常に良い!!!!例外、ありがとう – Fred

+0

あなたはどちらかを辞書でテストしましたか? –

+0

平均14秒、あなたの提案は0,006秒、スーパースコア、おかげで多くを与える – Fred

14
''.join([ chr(int(p, 2)) for p in wrap(binstr, 8) ]) 

これは何:wrapはまず文字列を8つの塊に分割します。次に、それぞれを繰り返し処理し、整数(基数2)に変換します。これらの変換された整数のそれぞれは、chrという文字でカバーされます。最後に、すべてをまとめて''.joinとしています。

chr(int(p, 2))の各ステップの内訳をもう少し:

>>> int('01101010', 2) 
106 
>>> chr(106) 
'j' 

それは上のあなたのパターンに適合させるために:これは

def decrypt(binary): 
    """Function to convert binary into string""" 
    binary = wrap(binary, 8) 
    ch = '' 
    for b in binary: 
     ch += chr(int(b, 2)) 
    return ch 

または

def decrypt(binary): 
    """Function to convert binary into string""" 
    return ''.join([ chr(int(p, 2)) for p in wrap(binary, 8) ]) 

辞書を何度も何度も繰り返すのではなく、その場で数学をやっているので、はるかに高速です。さらに、読みやすくなっています。

+0

のような項目は、それと同等です! – Fred

+0

あなたの弦はどれくらい大きいですか? 'ラップ(wrap)'が大半の時間を費やしている可能性があり、それについて何もできることは何もありません。いずれにせよ、これはまだ辞書の怪物よりも読みやすいです。 –

+0

私はラップを知っていませんが、長さが5000 - > 1.94秒、コードが - > 3.45秒です。 – Fred

3

実行速度はあなたのために最も重要なのは、なぜあなたの辞書にキーと値の役割を反転しない場合は? (の逆バージョンを作成することもできます)

ここで、dict全体をループするのではなく、キーで直接翻訳を検索します。

あなたの新しい機能は次のようになります。

def decrypt2(binary): 
    """Function to convert binary into string""" 
    binary = wrap(binary, 8) 
    ch = '' 
    for b in binary: 
     if b in DICO_INVERTED: 
      ch += DICO_INVERTED[b] 
    return ch 

があなたのバイナリ文字列のサイズに応じて、あなたはあなたの出力文字列を構築する方法を変更することにより、いくつかの時間を得ることができ(Efficient String Concatenation in Pythonまたはperformance tips - string concatenationを参照してください)。 joinを使用すると有望なようです。私はそれを試してみるだろう:''.join(DICO_INVERTED.get(b, '') for b in binary)

+1

私はまた、入力するのではなく、コードで辞書を作成することをお勧めします。 –

+0

@orangeoctopus、私はdictを入力しません;) – Fred

+0

@gecco、それはより効率的です、ありがとう! – Fred

関連する問題