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

时间:2017-03-30 08:02:04

标签: python python-3.x

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

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

2 个答案:

答案 0 :(得分:3)

您希望将4个第一位与该字节的最后4位进行交换。只需在列表理解中重建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"

答案 1 :(得分:0)

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

如果您希望交换字符串表示并且仅在\ x?部分,然后您可以使用这样的正则表达式:

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

这将创建3个顺序匹配元素:'\ x',任何单个char(第一个),任何单个char(第二个)。找到此模式后,它将替换为匹配项1,然后是3(第二个单个字符),然后是2(第一个单个字符),结果位于交换变量中。