从文件读取十六进制(Python)

2024-09-29 03:39:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件,包含十六进制数据和非十六进制数据。 例如,var _0x36ba=["\x69\x73\x41\x72\x72\x61\x79","\x63\x61\x6C\x6C","\x74\x6F\x53\x74\x72\x69\x6E\x67",]

当我直接在python控制台中粘贴这段代码时,我得到了var _0x36ba=["isArray","call","toString",]

但是当我试图读取文件并打印内容时,它给了我var _0x36ba=["\\x69\\x73\\x41\\x72\\x72\\x61\\x79","\\x63\\x61\\x6C\\x6C","\\x74\\x6F\\x53\\x74\\x72\\x69\\x6E\\x67","\\

似乎反斜杠是按原样解析的。在

如何读取文件并获得可读的输出?在


Tags: 文件数据varx6fx61x69x72x74
2条回答

编辑:请使用马蒂金的解决方案。我还不知道text.decode('string_escape'),当然它要快得多。以下是我最初的答案。在

使用此正则表达式可以取消字符串中所有转义的十六进制表达式:

def unescape(text):
    return re.sub(r'\\\\|\\x([0-9a-fA-F]{2})',
        lambda m: chr(int(m.group(1), 16)) if m.group(1)
                  else '\\', text)

如果您知道输入将不包含后跟x的双反斜杠(例如foo bar \\x41 bloh,可能应该解释为foo bar \x41 bloh,而不是foo bar \A bloh),那么您可以将其简化为:

^{pr2}$

有带有\xhh十六进制转义符的字符串文本。您可以使用string_escape编码对其进行解码:

text.decode('string_escape')

请参阅codecs模块文档的Python Specific Encodings section

string_escape
Produce a string that is suitable as string literal in Python source code

解码会反转编码:

^{pr2}$

作为一个内置的编解码器,这比使用正则表达式要快得多:

>>> from timeit import timeit
>>> import re
>>> def unescape(text):
...     return re.sub(r'\\x([0-9a-fA-F]{2})',
...         lambda m: chr(int(m.group(1), 16)), text)
...
>>> value = "\\x69\\x73\\x41\\x72\\x72\\x61\\x79"
>>> timeit('unescape(value)', 'from __main__ import unescape, value')
6.254786968231201
>>> timeit('value.decode("string_escape")', 'from __main__ import value')
0.43862390518188477

速度快了14倍。在

相关问题 更多 >