2

私は Windows で Python 3.2.3 を使用しており、C スタイルの ASCII ファイル内のバイナリ データを、後で struct モジュールを使用して解析するために同等のバイナリに変換しようとしています。たとえば、入力ファイルに「0x000A 0x000B 0x000C 0x000D」が含まれていて、それを「\x00\x0a\x00\x0b\x00\x0c\x00\x0d」に変換したいとします。

私が直面している問題は、文字列データ型が Python 3 で変更されたことと、16 進数から 2 進数に変換する組み込み関数 ( など) がbinascii.unhexlify()、通常の Unicode 文字列を受け入れなくなり、バイト文字列のみを受け入れるようになったことです。ユニコード文字列からバイト文字列に変換して元に戻すこのプロセスは私を混乱させているので、これを達成するためのより簡単な方法があるかどうか疑問に思っています。以下は私がこれまでに持っているものです:

with open(path, "r") as f:
    l = []
    data = f.read()
    values = data.split(" ")

    for v in values:
            if (v.startswith("0x")):
                    l.append(binascii.unhexlify(bytes(v[2:], "utf-8").decode("utf-8")

    string = ''.join(l)
4

2 に答える 2

1

agf が言うように、モード「r」で画像を開くと、文字列データが得られます。ここで行っているのはバイナリデータを見ることだけなので、おそらく 'rb' モードで開き、str ではなくバイト型の結果を作成することをお勧めします。

何かのようなもの:

with open(path, "rb") as f:
    l = []
    data = f.read()
    values = data.split(b" ")

    for v in values:
            if (v.startswith(b"0x")):
                    l.append(binascii.unhexlify(v[2:]))

    result = b''.join(l)
于 2012-10-07T04:08:50.470 に答える
1
3>> ''.join(chr(int(x, 16)) for x in "0x000A 0x000B 0x000C 0x000D".split()).encode('utf-16be')
b'\x00\n\x00\x0b\x00\x0c\x00\r'
于 2012-10-07T04:13:04.887 に答える