Python字符串转义的十六进制


问题内容

我下面有一些python代码,我设法拼凑起来以实现所需的功能,但是对于python来说,它是一个新手,我认为应该有一个比这里的解决方案优雅得多的解决方案。

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

在示例中,MAGICSTRING为1234,并且“值”的预期结果为'\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')

赞赏可以对以上所做的任何改进。


问题答案:

该字符串'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字符串中的每个字节都是具有这种约束值的字节,并且编码后的'hex'编解码器将产生一个字符串这些字节的十六进制数字,然后再从十六进制数字的字节。

这样,您要做的就是添加\x00空字节和长度:

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

在这里,该\xhh符号用于产生空字节,该chr()函数产生长度“
byte”。

演示:

>>> 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