将Python字符串转换为转义十六进制
我在下面有一些python代码,我设法拼凑起来实现了我所需要的,但是由于对python非常陌生,我相信应该有一个比我这里的解决方案更优雅的解决方案 基本上,我需要获取一个任意字符串(将Python字符串转换为转义十六进制,python,string,python-2.7,hex,Python,String,Python 2.7,Hex,我在下面有一些python代码,我设法拼凑起来实现了我所需要的,但是由于对python非常陌生,我相信应该有一个比我这里的解决方案更优雅的解决方案 基本上,我需要获取一个任意字符串(MAGICSTRING),并将其每个字符转换为十六进制值,然后在结果十六进制字符串的开头和结尾填充0x00,最后将整个填充字符串长度的十六进制值放在末尾。然后我需要这些转义,以便稍后可以将其传递到套接字连接 在本例中,MAGICSTRING是1234,“value”的预期结果是'\x00\x31\x32\x33\x3
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')
MAGICSTRING='1234'
i=0
hexpass=“”
而我
感谢对上述内容所做的任何改进。字符串
'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
表示法生成空字节,并生成长度“byte”
演示:
一行代码。简单、优雅的解决方案。工作如期进行。非常感谢。这个asnwer对我不适用“LookupError:'hex'不是文本编码;使用codecs.encode()处理任意编解码器”@GM:您使用的是Python 3,它不支持字节数中的二进制到二进制编解码器。decode()和
str.encode()
。这个问题用python-2.7
标记,其中bytestring类型str
有一个str.encode()
方法,可以使用任何代码从一个字节到另一个字节进行编码。您可以直接使用编解码器
模块,但您可能希望使用,或者将字符串编码为字节(使用您认为最适合文本的编解码器),然后使用字节。fromhex()
和bytesvalue.hex()
。感谢您的澄清,并为我没有看到标记的错误感到抱歉。
>>> 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