2017-05-12 17 views
0

struct.unpackを使用して、すべてのC構造体フィールドとその値(整数と文字列)のダンプから作成されたバイナリファイルを読み込みます。アンパックされたタプルは、フィールドとその値の中間的な辞書表現を作成するために使用され、後でテキストファイル出力に書き込まれます。Python struct.unpack - バイナリ文字列リテラルをアスキーテキストファイルに変換する

テキストファイルの出力は以下のように文字列を表示します。

ID = b'000194901137\x00\x00\x00\x00' 
timestampGMT = 1489215906 
timezoneDiff = -5 
timestampPackage = 1489215902 
version = 293 
type = b'FULL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 

プログラムは、以前にそれが正常に動作するために使用のpython 2.6、中に書かれていました。テキストファイルへの書き込み中に私たちは、不要な進文字を削除するには、以下のラムダ式を使用していました:Pythonの3.5への移行

filtered_string = filter(lambda x: x in string.printable, line) 

それが今のフィルタを返すために、ラムダ式は、もはやサポートされていません簡単に文字列に変換することはできません。

これらのバイナリ文字列リテラルを同等のASCII文字列(末尾のNUL '\ x00'なし)に変換するPythonの方法は何ですか。通常の文字列値として記述されます。

また、現在のコンテキストで可能な最良のソリューションを探すために、各ファイルに対して処理されるエントリが複数存在します(複数のファイルがあります)。

+0

が、それはちょうどあなたが扱っているゼロ化される。これを読んで - 例えば: 'type.rstrip(B」だろう\ x00 ') '作業しているか、それとも印刷可能なチェックでなければなりません...後で' bytes'ではなく 'str'を望むかどうかは分かりませんので、'' '.join(ch.isprintable()ならtext.decode(' ascii ')のch) '私はそう思っています... –

+0

その唯一のNULLです。文字列全体を印刷しようとしているので、末尾のNULLも出力します。 rstrip()を試しましたが、復帰文字も取り除きます。 – prohit99

+0

もしあなたが上記のようにrstripに渡したいものを渡すなら、それはすべきです: 'type.rstrip(b '\ x00')' –

答えて

0

Python 2では、テキストとバイナリの両方のデータにstr型を同じ意味で使用でき、うまくいきました。バイナリファイルで符号化された2

$ python3 
Python 3.5.0 (default, Sep 15 2015, 13:42:03) 
[GCC 4.6.3] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> type(b'aaa') 
<class 'bytes'> 
>>> type(b'aaa').__mro__ 
(<class 'bytes'>, <class 'object'>) 
>>> type('aaa') 
<class 'str'> 
>>> type('aaa').__mro__ 
(<class 'str'>, <class 'object'>) 

$ python 
Python 2.6.6 (r266:84292, Nov 21 2013, 10:50:32) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> type(b'aaa').__mro__ 
(<type 'str'>, <type 'basestring'>, <type 'object'>) 
>>> type('aaa').__mro__ 
(<type 'str'>, <type 'basestring'>, <type 'object'>) 

文字列は必要bytes型文字列リテラルとして読み込まれるのpython3バイナリデータの読み出しからタイプbytesの であり、それは、Pythonのような共通のベースクラスを共有しませんstr(Unicode)タイプに変換され、通常の文字列としてファイルに表示/書き込まれます。

私はstruct.unpack()からタプルを取得した後、私は次のようにします。

valTuple = struct.unpack(fmt, self.data[off : goff + struct_size]) 

    valList = list(valTuple) 
    for i in range(len(valList)): 
    if type(valList[i]) == bytes: 
     valList[i] = valList[i].rstrip(b'\x00').decode() 

https://docs.python.org/3/howto/pyporting.html#text-versus-binary-data

関連する問題