【问题标题】:Python String to Escaped HexPython字符串转义十六进制
【发布时间】:2015-05-30 06:29:01
【问题描述】:

我在下面有一些 python 代码,我设法拼凑起来以实现我需要的东西,但是对于 python 来说,我相信应该有一个比我这里的解决方案更优雅的解决方案。

基本上我需要获取一个任意字符串 (MAGICSTRING) 并将它的每个字符转换为它们的十六进制值,然后将 0x00 填充到生成的十六进制字符串的开头和结尾,最后将最后整个填充字符串的长度。然后我需要将这些转义,以便稍后将其传递给套接字连接。

在示例中,MAGICSTRING 是 1234,'value' 的预期结果是 '\x00\x31\x32\x33\x34\x00\x06'

见下面的例子。

MAGICSTRING = '1234'
i=0
hexpass = ''
while i < len(MAGICSTRING):
    hexpass = hexpass + hex(ord(MAGICSTRING[i]))[2:]
    i += 1
strlen = len(MAGICSTRING) + 2
sendstr = '00'+ hexpass + '00' + '0' + hex(strlen)[2:]
value = sendstr.decode('hex')

赞赏可以对上述内容进行的任何改进。

【问题讨论】:

    标签: python string python-2.7 hex


    【解决方案1】:

    字符串'1234'已经等价于'\x31\x32\x33\x34'

    >>> '\x31\x32\x33\x34'
    '1234'
    >>> '\x31\x32\x33\x34' == '1234'
    True
    

    因此将其编码为十六进制然后再次解码是......忙碌的工作:

    >>> '1234'.encode('hex').decode('hex')
    '1234'
    

    \xhh 只是一个符号,可以帮助您创建值;当回显字节字符串时,Python 将始终直接显示可打印的 ASCII 字符,而不是使用 \xhh 表示法。

    这里的十六进制表示法只是表示每个字节的值的一种方式,它实际上是一个介于 0 和 255 之间的整数。Python 字符串中的每个字节都是具有这种约束值的字节,并编码为 @987654329 @codec 为这些字节生成一个带有十六进制数字的字符串,并再次从十六进制数字生成字节。

    因此,您所要做的就是添加 \x00 空字节和长度:

    MAGICSTRING = '1234'
    value = '\x00{}\x00{}'.format(MAGICSTRING, chr(len(MAGICSTRING) + 2))
    

    这里\xhh 表示法用于产生空字节,chr() function 产生长度“字节”。

    演示:

    >>> MAGICSTRING = '1234'
    >>> '\x00{}\x00{}'.format(MAGICSTRING, chr(len(MAGICSTRING) + 2))
    '\x001234\x00\x06'
    >>> '\x00{}\x00{}'.format(MAGICSTRING, chr(len(MAGICSTRING) + 2)) == '\x00\x31\x32\x33\x34\x00\x06'
    True
    

    【讨论】:

    • 一行代码。简单、优雅的解决方案。按预期工作。谢谢!
    • 这个 asnwer 对我不起作用“LookupError: 'hex' 不是文本编码;使用 codecs.encode() 来处理任意编解码器”
    • @GM:您使用的是 Python 3,它不支持 bytes.decode()str.encode() 中的二进制到二进制编解码器。这个问题用python-2.7 标记,其中字节串类型str 有一个str.encode() 方法,可以让您使用任何代码从字节编码到字节。您可以直接使用codecs 模块,但您更愿意使用binascii module,或者将字符串编码为字节(使用您认为最适合文本的任何编解码器),然后使用bytes.fromhex()bytesvalue.hex()
    • 感谢您的澄清,抱歉我没有看到标签。
    猜你喜欢
    • 2012-08-15
    • 2016-04-22
    • 2011-01-21
    • 2015-01-06
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    相关资源
    最近更新 更多