【问题标题】:Python - Printing Hex from a filePython - 从文件中打印十六进制
【发布时间】:2011-07-20 20:40:06
【问题描述】:

我有以下代码:

code1 = ("\xd9\xf6\xd9\x74\x24\xf4\x5f\x29\xc9\xbd\x69\xd1\xbb\x18\xb1")
print code1

code2 = open("code.txt", 'rb').read()
print code2

code1 输出:

�צ�t$פ_)�½i�»±

code2 输出:

"\xd9\xf6\xd9\x74\x24\xf4\x5f\x29\xc9\xbd\x69\xd1\xbb\x18\xb1"

我需要 code2(我从文件中读取)具有与 code1 相同的输出。
我该如何解决这个问题?

【问题讨论】:

  • code.txt 中有什么?像这样的字符串:"\xd9\xf6\xd9\x74\x24\xf4\x5f\x29\xc9\xbd\x69\xd1\xbb\x18\xb1" 还是这个字符串表示的字节?
  • 我的文本文件中有“\xd9\xf6\xd9\x74\x24\xf4\x5f\x29\xc9\xbd\x69\xd1\xbb\x18\xb1”。当我把它放在一个变量中并打印它时,它以二进制数据的形式出现,这是我需要的,但是当我从文件中读取它并将它打印为字符串时
  • sys.getdefaultencoding() 的输出是什么?
  • @Shai - 所以你的解决方案在下面的答案中:)
  • 好的,我刚刚意识到,引号是输出的一部分,所以你只需要把它们去掉。

标签: python file printing hex


【解决方案1】:

解释一串字符,如

In [125]: list(code2[:8])
Out[125]: ['\\', 'x', 'd', '9', '\\', 'x', 'f', '6']

因为 Python 会使用带有转义字符的字符串,例如

In [132]: list('\xd9\xf6')
Out[132]: ['\xd9', '\xf6']

使用.decode('string_escape'):

In [122]: code2.decode('string_escape')
Out[122]: '\xd9\xf6\xd9t$\xf4_)\xc9\xbdi\xd1\xbb\x18\xb1'

在 Python3 中,string_escape 编解码器已被移除,因此等效变为

import codecs
codecs.escape_decode(code2)[0]

【讨论】:

  • string_escape...这很好!
【解决方案2】:

这个例子:

import binascii

code1 = "\xd9\xf6\xd9\x74\x24\xf4\x5f\x29\xc9\xbd\x69\xd1\xbb\x18\xb1"
code2 = "\\xd9\\xf6\\xd9\\x74\\x24\\xf4\\x5f\\x29\\xc9\\xbd\\x69\\xd1\\xbb\\x18\\xb1"

print code1 == binascii.unhexlify(code2.replace('\\x', ''))

打印True

您可以使用binascii.unhexlify 将十六进制文本表示转换为二进制,但首先必须从字符串中删除\x

编辑:我刚刚意识到双引号是您输出的一部分。本质上,您只需要传递有效的十六进制字符串,因此需要剥离其他所有内容。在您的情况下,您需要将code2.replace('\\x', '').strip('"') 传递给unhexlify。您可以使用 eval 并且可能会使用,但请考虑使用 Security of Python's eval() on untrusted strings? 以供将来选择。

【讨论】:

    【解决方案3】:

    print eval(code2) 应该可以完成这项工作。

    【讨论】:

    • 当心evil Eval... 这个技巧足以用于学习/调试目的,但不应应用于生产逻辑。
    • 我认为这是最短的解决方案,这将是最优雅的,但人们的声音反对。也许我应该预先添加一个正则表达式匹配来断言 code.txt 确实包含 Python 字符串文字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多