2017-12-16 20 views
1

私の質問は、処理中に情報が失われた可能性がある場合、元の文字列を取り出す方法についてです。 私はこのようなもので、バイトのシフトを使用してエンコードのルーチン見直している:右、私は、特定の場合に情報を失うんだけど、私は方法を把握しようとしているシフトされた場合は1ビットでバイトシフトでエンコードを解読する最良の方法

def encode(string): 
    encoded = '' 
    for char in string: 
     encoded += chr(ord(char)^(ord(char) >> 1)) 
    return encoded 

In [90]: ord('A') >> 1 << 1 
Out[90]: 64 

In [91]: ord('B') >> 1 << 1 
Out[91]: 66 

In [92]: ord('C') >> 1 << 1 
Out[92]: 66 

はそれが可能トンのようになります。私は与えられた文字のリストについては、情報を失うことだと

def decode(string): 
    decoded = '' 
    for char in string: 
     decoded += ........ 
    return decoded 

ような方法で、元の文字列を再構成しますコード化された文字列を逆にする?私はしばらくの間、私の頭を悩まされています。私はこれを行うことができるという感覚を持っていますが、私の脳はここにこだわっているようです。

答えて

2

最上位ビットを見てください。これは排他的論理和もされていないか、または変更されていませあなたはそれを知っています。 2番目の最上位ビットは、すでに知っている最上位のものとXORされます。

このXORを取り消して、2番目に高いビットを使用することもできます。すべてのビットが明らかになるまでこれを繰り返します。また、最下位ビットの情報はここで失われません。それは2番目のLSBとXORされます。

私はそれが最も効率的な方法であるかどうかわかりませんが、eb >> 1で符号化されたバイト(名前はebとする)をXORします。

結果は

eb2 = eb^eb >> 1 # == char^char >> 2バイトchar >> 8 == 0従ってeb4 == charについて

次いで

eb3 = eb2^eb2 >> 2 # == char^char >> 4 
eb4 = eb3^eb3 >> 4 # == char^char >> 8 

(ここでバイト値としてcharを意味する)です。

+0

@StefanPochmann私はアプローチを使って答えを更新しました –

+0

ニース。私は同じ方法を考え出しましたが、あなたの推論ははるかに優れています。私は、この方法がシングル・チャル・デコードのためにできる最善の策であると考えています。エンコーディングよりもはるかに面倒です。私はそれを修復するよりも何かを壊す方が簡単だと思います:-)。長い文字列の場合は、ちょうど私が投稿したようなルックアップテーブルを使うほうがよいと思います。 –

2

マイケルの答えは(ちょうどここASCIIをやって)逆ルックアップテーブルを使用して、それを行うには些細な、おそらく高速な方法でそれが可能だと証明した、とここにある:

def decode(string): 
    return string.translate({i^i>>1: i for i in range(128)}) 

デモ:

>>> encode('StackOverflow') 
'zNQR^hMWKUZXL' 
>>> decode(encode('StackOverflow')) 
'StackOverflow' 

そして、それが動作することを些細な実験的証拠:

>>> len({i^i>>1 for i in range(128)}) 
128 

128の可能な入力が12につながります8つの異なる出力があるので、2つの異なる文字は同じ文字としてエンコードされないので、プロセスを逆にすることは可能です。

関連する問題