【问题标题】:Converting a hex-string representation to actual bytes in Python在 Python 中将十六进制字符串表示形式转换为实际字节
【发布时间】:2021-05-19 04:35:59
【问题描述】:

我需要将此文本文件的第三列加载为十六进制字符串

http://www.netmite.com/android/mydroid/1.6/external/skia/emoji/gmojiraw.txt

>>> open('gmojiraw.txt').read().split('\n')[0].split('\t')[2]
'\\xF3\\xBE\\x80\\x80'

如何打开文件,以便我可以将第三列作为十六进制字符串:

'\xF3\xBE\x80\x80'

我也试过二进制模式和十六进制模式,没有成功。

【问题讨论】:

    标签: python hex representation


    【解决方案1】:

    你可以:

    1. 删除\x-es
    2. 对结果字符串使用 .decode('hex')

    代码:

    >>> '\\xF3\\xBE\\x80\\x80'.replace('\\x', '').decode('hex')
    '\xf3\xbe\x80\x80'
    

    注意反斜杠的适当解释。当字符串表示为 '\xf3' 时,意味着它是一个字节值为 0xF3 的单字节字符串。当它是'\\xf3',这是你的输入,它表示一个由4个字符组成的字符串:\xf3

    【讨论】:

    • 哇,谢谢你的工作,stackoverflow 不允许我现在接受这个答案!
    • @kevin:我不知道为什么会这样,但不要着急。人们可能会想出比这更好的答案。您可以稍后(即几天后)接受它
    • 它说,我必须等待至少 10 分钟才能接受答案。好的,我将等待接受答案!但我怀疑是否有任何其他答案可以改善这一点
    • decode('hex') 不适用于 Python3,但如果您需要 Python2 答案,这是一个很好的答案
    【解决方案2】:

    快速的'n'dirty回复

    your_string.decode('string_escape')
    
    >>> a='\\xF3\\xBE\\x80\\x80'
    >>> a.decode('string_escape')
    '\xf3\xbe\x80\x80'
    >>> len(_)
    4
    

    奖金信息

    >>> u='\uDBB8\uDC03'
    >>> u.decode('unicode_escape')
    

    一些琐事

    有趣的是,我在 Karmic Koala Ubuntu (sys.maxunicode==1114111) 上安装了 Python 2.6.4,在 Gentoo (sys.maxunicode==65535) 上安装了 Python 2.6.5;在 Ubuntu 上,unicode_escape-decode 结果是 \uDBB8\uDC03,在 Gentoo 上是 u'\U000fe003',两者的长度都是正确的。除非它是固定在 2.6.4 和 2.6.5 之间的东西,否则我对 2-byte-per- 印象深刻unicode-character Gentoo 版本报告正确的字符。

    【讨论】:

    • \Uxxxxxxxx\uxxxx\uxxxx 似乎是 Python 2.6 中引入的构建时选项。在“窄构建”中,BMP 之外的代码点表示为 UTF-16 代理对。切线见issue #1477
    【解决方案3】:

    如果您使用的是 Python2.6+,这里是使用 eval 的安全方法

    >>> from ast import literal_eval
    >>> item='\\xF3\\xBE\\x80\\x80'
    >>> literal_eval("'%s'"%item)
    '\xf3\xbe\x80\x80'
    

    【讨论】:

    • +1:对于 Python 3 的支持,如果不是所有字节都被转义,我也喜欢它的工作原理,例如它可以很好地转换 'hello\\x00world'。
    【解决方案4】:

    去掉 "\x" 作为 Eli 的答案后,你可以这样做:

    int("F3BE8080",16)
    

    【讨论】:

      【解决方案5】:

      如果您信任来源,可以使用eval('"%s"' % data)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-05
        • 2012-06-23
        • 2018-06-16
        • 2022-01-07
        • 1970-01-01
        • 2013-11-26
        • 1970-01-01
        相关资源
        最近更新 更多