如何在 python 中翻转字节



我正在尝试解码一个反转字节集合的文件。目前,我的代码读取并复制文件,但我想在写出副本之前编辑一些字节。以字符串格式打印文件的二进制文件后,它看起来像:

b'r\x00\x00\x00\x06\x00P\x00\x14\x00\x10\x00\x0e\x00P\x00\

x15\x00(7\xf8y(=(\xdb(\x8e\x08\x00

。等等。我想翻转读出\x**的字节,如下所示:

\x01 → \x10 , \x81 → \x18 , \x40 → \x04 , \xae → \xea

您希望将

前 4 位与字节的最后 4 位交换。只需在列表理解中重建bytes数组,并进行一些移动和掩蔽:

>>> b = b'rx00x00x00x06x00Px00x14x00x10x00x0ex00Px00x15x00)7xf8y(=(xdb(x8ex08x00'
>>> bytes(((x<<4 & 0xF0) + (x >> 4)) for x in b)
b"'x00x00x00`x00x05x00Ax00x01x00xe0x00x05x00Qx00x92sx8fx97x82xd3x82xbdx82xe8x80x00"

你的问题需要澄清一下。 您是在字符串表示形式还是二进制中交换半字节。 如果是二进制,您是否也想在可打印字符上交换半字节(例如,对于部分 ...\x00 (7 \xf8 y(=( \xdb...,粗体字符不是 \x?? 格式,那么它们应该交换半字节吗?

如果你想要交换字符串表示形式,并且只交换在 \x?? 部分,那么你可以使用这样的正则表达式:

import re
preswap = <set to your string>
swapped = re.sub(r'(\x)(.)(.)',r'132',preswap)

这将创建 3 个连续匹配元素:"\x"、任何单个字符(第一个(、任何单个字符(第二个(。 找到此模式后,将其替换为匹配项 1,然后是 3(第二个单字符(,然后是 2(第一个单字符(,结果在交换的变量中。

最新更新