6

.binファイルがあり、16進データを単純にバイト反転したいと思います。たとえば、@ 0x10は、AD DE DE C0を読み取り、DE ADC0DEを読み取りたいとします。

これを行う簡単な方法があることは知っていますが、私は初心者でPythonを学んでおり、日常業務を支援するための簡単なプログラムをいくつか作成しようとしています。0x10だけでなく、この方法でファイル全体を変換したいと思います。

開始オフセット0x000000で変換し、ブロックサイズ/長さは1000000です。

これが私のコードです、多分あなたは私に何をすべきか教えてくれます。私はそれを取得していないと確信しています、そして私はプログラミングとPythonに不慣れです。あなたが私を助けることができれば私はそれを非常に感謝します。

def main():
    infile = open("file.bin", "rb")
    new_pos = int("0x000000", 16)
    chunk = int("1000000", 16)
    data = infile.read(chunk)
    reverse(data)

def reverse(data):
    output(data)

def output(data):
    with open("reversed", "wb") as outfile:
        outfile.write(data)

main()

そして、あなたは逆転のためのモジュールを見ることができます、私は多くの異なる提案を試みました、そしてそれはファイルをそのまま通過させるか、それはエラーを投げます。モジュールリバースが空になったことは知っていますが、いろいろなことを試しました。ABCDをCDABに変換するには、モジュールを逆にする必要があります。入力ありがとうございます

編集:ファイルは16 MBで、ファイル全体のバイト順序を逆にします。

4

5 に答える 5

16

Python 3.4では、これを使用できます。

>>> data = b'\xAD\xDE\xDE\xC0'
>>> swap_data = bytearray(data)
>>> swap_data.reverse()

結果は

bytearray(b'\xc0\xde\xde\xad')
于 2015-08-06T12:42:54.087 に答える
14

Python 2では、バイナリファイルは文字列として読み取られるため、文字列のスライスは隣接するバイトのスワッピングを簡単に処理する必要があります。

>>> original = '\xAD\xDE\xDE\xC0'
>>> ''.join([c for t in zip(original[1::2], original[::2]) for c in t])
'\xde\xad\xc0\xde'

Python 3では、バイナリファイルはバイトとして読み取られます。別のバイト配列を作成するために必要な変更はわずかです。

>>> original = b'\xAD\xDE\xDE\xC0'
>>> bytes([c for t in zip(original[1::2], original[::2]) for c in t])
b'\xde\xad\xc0\xde'

structモジュール<でおよび> エンディアンフォーマットコードを使用して、同じ結果を得ることができます。

>>> struct.pack('<2h', *struct.unpack('>2h', original))
'\xde\xad\xc0\xde'

ハッピーバイトスワッピング:-)

于 2013-01-27T02:55:03.347 に答える
11
data = b'\xAD\xDE\xDE\xC0'
reversed_data = data[::-1]
print(reversed_data)
# b'\xc0\xde\xde\xad'
于 2017-10-08T06:46:10.573 に答える
0

Pythonには、リストの値を逆にするリスト演算子があります-> nameOfList [::-1]

したがって、16進値を文字列として格納し、それらをリストに入れてから、次のようなことを試してみてください。

def reverseList(aList):
rev = aList[::-1]
outString = ""
for el in rev:
    outString += el + " "
return outString
于 2013-01-27T01:17:58.587 に答える
0

Python3

bytes(reversed(b'\xAD\xDE\xDE\xC0'))
# b'\xc0\xde\xde\xad'
于 2022-02-04T10:16:15.337 に答える