【问题标题】:Python 2.7: how to prevent automatic decoding from hex to stringPython 2.7:如何防止从十六进制自动解码为字符串
【发布时间】:2016-05-21 04:10:35
【问题描述】:

我正在使用 python 套接字模块,正在使用我编写的 udp 客户端。我不喜欢它如何处理我的十六进制文字。示例:

>>> querydns = '\xb9\x1b\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03\x77\x77\x77\x06\x67\x6f\x6f\x67\x6c\x65\x03\x63\x6f\x6d\x00\x00\x01\x00\x01'
>>> querydns
'\xb9\x1b\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x06google\x03com\x00\x00\x01\x00\x01'

>>> replydata
'\xb9\x1b\x81\x80\x00\x01\x00\x06\x00\x00\x00\x00\x03www\x06google\x03com\x00\x00\x01\x00\x01\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\xd4\x00\x04@\xe9\xb0j\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\xd4\x00\x04@\xe9\xb0i\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\xd4\x00\x04@\xe9\xb0\x93\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\xd4\x00\x04@\xe9\xb0g\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\xd4\x00\x04@\xe9\xb0h\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\xd4\x00\x04@\xe9\xb0c'

注意它是如何自动将一些十六进制解码为字符的?我只想处理十六进制值,没有@或www。有没有简单的方法来停止这种自动解码?

【问题讨论】:

  • 我提出了一个答案,但我想得越多,我就越不明白为什么您要更改对我们人类有意义的可打印字符来强迫它们留下来,因为十六进制没有多大意义我
  • 一个简短的精度:您所说的“自动解码”仅在您在解释器中输出字符串时发生。或者当您使用repr(querydns) 时。它实际上是相反的:它将不安全的字符编码为\xXX 形式,因此可以复制粘贴来重新创建字符串。

标签: python string dns hex decode


【解决方案1】:

你真的不能......你有几个选择(有点)

import binascii
print binascii.hexlify(querydns)

或伪造它(保留前导零需要更多努力)...

print "".join("\\x%s"%(hex(ord(data_byte))[2:]) for data_byte in querydns)

或者我认为可以组合使用

hexy = binascii.hexlify(querydns)
print "".join("\\x%s"%hexy[i:i+2] for i in range(len(hexy)-1))

【讨论】:

    【解决方案2】:

    您可以通过在字符串前添加“r”将其用作“原始”字符串。 原始字符串不被 python 处理,而是按原样获取。

    string = r"example string"
    

    【讨论】:

    • 谢谢,这就是我要找的东西,我只需要一种方法来操作各个十六进制字节。谢谢!
    猜你喜欢
    • 2014-12-28
    • 2020-11-11
    • 2019-01-02
    • 2018-08-21
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2017-05-07
    相关资源
    最近更新 更多