Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Python字符串转换为转义十六进制_Python_String_Python 2.7_Hex - Fatal编程技术网

将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

我在下面有一些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')
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