【问题标题】:convert hexstring to individual bytes python 2.7将十六进制字符串转换为单个字节 python 2.7
【发布时间】:2018-01-08 10:03:57
【问题描述】:

早上好,

这可能非常简单,但我的大脑今天无法正常工作。

所以我有一个十六进制字符串f70307d600017010 我需要将它转换为\xf7\x03\x07\xd6\x00\x01\x70\x10

或类似的东西,即将字符串转义为十六进制。

大家有什么建议吗?

谢谢 吉姆

【问题讨论】:

  • 您所期望的究竟是什么? str?

标签: python python-2.7 escaping hex


【解决方案1】:

如果您希望该输出的 result 作为文字,即:

>>> '\xf7\x03\x07\xd6\x00\x01\x70\x10'
'\xf7\x03\x07\xd6\x00\x01p\x10'

使用binascii 模块:

>>> import binascii
>>> s = "f70307d600017010"
>>> binascii.unhexlify(s)
'\xf7\x03\x07\xd6\x00\x01p\x10'

【讨论】:

  • 实际上,您不必使用该库对任何内容进行分块:binascii.unhexlify('f70307d600017010')'\xf7\x03\x07\xd6\x00\x01p\x10'p\x70,所以没关系)。
  • @Alfe 是的,你是绝对正确的,我真傻。该睡觉了。
【解决方案2】:

这绝不是你应该这样做的方式,但考虑到我很无聊:

x = "f70307d600017010"
y = "\\"
count = 1
for letter in x:
    print(count)
    if count > 2:
        y = y + "\\" + "x" + letter
        count = 1
    elif 1 == count:
        y = y + "x" + letter
    elif count % 2 == 1:
        y = y + letter + "\\"
    elif count % 2 == 0:
        y = y + letter

    count = count + 1

【讨论】:

    【解决方案3】:

    有几种使用正则表达式的解决方案。我最喜欢的是这个:

    re.sub('(..)', r'\x\1', 'f70307d600017010')
    

    另一个可能是:

    ''.join(r'\x' + x for x in re.findall('..', 'f70307d600017010'))
    

    这些将创建一串转义字节(基于标签“转义”是这个意思的假设)。如果您想创建一个 未转义 字节的字符串:

    re.sub('(..)', lambda m: chr(int(m.group(), 16)), 'f70307d600017010')
    

    编辑:我现在更喜欢使用binascii 模块的@juanpa-arrivillaga 的答案:binascii.unhexlify('f70307d600017010')

    【讨论】:

    • 最后一个成功了,我怀疑我不需要像以前想的那样真正转义字符。
    猜你喜欢
    • 2021-08-29
    • 2023-03-07
    • 2022-06-18
    • 2017-08-23
    • 2012-06-05
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多