如何在Python中翻转一个字节?

6
我正在尝试解码一个反转字节的文件。目前,我的代码可以读取并复制该文件,但我想在写出副本之前编辑其中的一些字节。将文件的二进制以字符串格式打印后,它看起来像这样: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。

请将您的示例数据更清晰明了,否则无法处理。 - Mr. Nun.
2
那是一个奇怪的字节翻转定义... - poke
2个回答

5

您想要交换字节的前四位和后四位。只需使用一些移位和掩码在列表理解中重新构建bytes数组:

>>> b = b'r\x00\x00\x00\x06\x00P\x00\x14\x00\x10\x00\x0e\x00P\x00\x15\x00)7\xf8y(=(\xdb(\x8e\x08\x00'

>>> bytes(((x<<4 & 0xF0) + (x >> 4)) for x in b)
b"'\x00\x00\x00`\x00\x05\x00A\x00\x01\x00\xe0\x00\x05\x00Q\x00\x92s\x8f\x97\x82\xd3\x82\xbd\x82\xe8\x80\x00"

运行得非常好,文件以可读的Shift-JIS文本形式输出。 - Drew

0

您的问题需要进一步澄清。您是在字符串表示形式还是二进制中交换nibbles?如果是二进制,您是否也想交换可打印字符的nibbles(例如,在部分...\x00 )7 \xf8 y(=( \xdb...中,加粗的字符不是\x??格式,所以它们应该交换nibbles吗?)?

如果您想在字符串表示形式上进行交换,并且仅在\x??部分上进行交换,则可以使用类似于以下的正则表达式:

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

这将创建3个连续的匹配元素:'\x',任何单个字符(第一个),任何单个字符(第二个)。当找到此模式时,它将被替换为匹配项1,然后是3(第二个单个字符),然后是2(第一个单个字符),结果存储在swapped变量中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接