1

オブジェクトを1と0の文字列に変換しようとして、このPythonコードを作成しましたが、データの選択を解除できないため、デコードが失敗します。これはコードです:

def encode(obj):
    'convert an object to ones and zeros'
    def tobin(str):
        rstr = ''
        for f in str:
            if f == "0": rstr += "0000"
            elif f == "1": rstr += "0001"
            elif f == "2": rstr += "0010"
            elif f == "3": rstr += "0100"
            elif f == "4": rstr += "1000"
            elif f == "5": rstr += "1001"
            elif f == "6": rstr += "1010"
            elif f == "7": rstr += "1100"
            elif f == "8": rstr += "1101"
            elif f == "9": rstr += "1110"
            else: rstr += f
        return rstr
    import pickle, StringIO
    f = StringIO.StringIO()
    pickle.dump(obj, f)
    data = f.getvalue()
    import base64
    return tobin(base64.b16encode(base64.b16encode(data)))
def decode(data):
    def unbin(data):
        rstr = ''
        for f in data:
            if f == "0000": rstr += "0"
            elif f == "0001": rstr += "1"
            elif f == "0010": rstr += "2"
            elif f == "0100": rstr += "3"
            elif f == "1000": rstr += "4"
            elif f == "1001": rstr += "5"
            elif f == "1010": rstr += "6"
            elif f == "1100": rstr += "7"
            elif f == "1101": rstr += "8"
            elif f == "1110": rstr += "9"
        return rstr
    import base64
    ndata = base64.b16decode(base64.b16decode(unbin(data)))
    import pickle, StringIO
    f = StringIO.StringIO(ndata)
    obj = pickle.load(f)
    return obj
4

4 に答える 4

2

いくつかの問題があると思いますが、1つは、デコードするときに、現在行っているような1文字ではなく、unbin()関数で4文字のグループを反復処理する必要があることです。

于 2010-07-01T19:27:35.950 に答える
1

私はあなたのためにより良い解決策があると思います。これは、数字だけでなくすべてを「暗号化」するため、さらに安全になるはずです。

MAGIC = 0x15 # CHOOSE ANY TWO HEX DIGITS YOU LIKE

# THANKS TO NAS BANOV FOR THE FOLLOWING:
unbin = tobin = lambda s: ''.join(chr(ord(c) ^ MAGIC) for c in s)
于 2010-07-01T19:41:42.223 に答える
0

your関数binunbin関数は互いに逆ではありませんbin。文字をそのまま出力に入れるelse句がありますが、unbinそれらを返すelse句がないためです。

于 2010-07-01T19:36:34.123 に答える
0

ちなみに...base64.b16encode(base64.b16encode(data))は。と同等data.encode('hex').encode('hex')です。そして、マッピングを行うためのより簡単で高速な方法があります、

def tobin(numStr):
    return ''.join(("0000","0001","0010","0100","1000","1001","1010","1100","1101","1110")[int(c)] for c in numStr)

このエンコーディングの全体的な考え方は、表面的には複雑に見えますが、あまり良くありません。まず、16進ダンプの各桁は、常に0と1の同じ8つの長さの文字列に一致するため、暗号化はあまり行われません。

>>> hexd = '0123456789ABCDEF'
>>> s = hexd.encode('hex')
>>> s
'30313233343536373839414243444546'
>>> s=''.join(["0000","0001","0010","0100","1000","1001","1010","1100","1101","1110"][int(c)] for c in s)
>>> s
'01000000010000010100001001000100010010000100100101001010010011000100110101001110100000011000001010000100100010001000100110001010'
>>> for i in range(0,len(s),8):
...     print hexd[i/8], s[i:i+8], chr(int(s[i:i+8],2))
... 
0 01000000 @
1 01000001 A
2 01000010 B
3 01000100 D
4 01001000 H
5 01001001 I
6 01001010 J
7 01001100 L
8 01001101 M
9 01001110 N
A 10000001 
B 10000010 ‚
C 10000100 „
D 10001000 ˆ
E 10001001 ‰
F 10001010 Š

第二に、漬物のサイズを16倍に膨らませます!「0」と「1」の8ビットごとにバイトに変換してこれをパックしたとしても(たとえばchr(int(encoded[i:i+8],2)))、それでもピクルスの2倍です。

于 2010-07-01T22:18:34.213 に答える