使用我发现制作telnet服务器的一些代码使用Python套接字。服务器代码工作正常。我需要向客户端发送十六进制字符串以逃避字符问题。当我像这样向客户端发送数据时:
conn.sendall('\x74\x65\x73\x74\x31\x32\x33\x0D\x0A')
或
test_var = '\x74\x65\x73\x74\x31\x32\x33\x0D\x0A'
conn.sendall(test_var)
它完美无缺。当我尝试创建一个字符串并将其存储在变量中时(如下面的kludge):
def recover_raw_data(data):
data_list = []
hex_list = []
for items in data:
data_list.append(ord(items))
for items in data_list:
hex_list.append("\\")
value = '%02X' % int(items)
hex_list.append("0x" + value)
print hex_list
almost_final_data = "".join(hex_list)
just_about_final_data = almost_final_data.replace('\\0x', '\\x')
final_data = just_about_final_data
print final_data
conn.sendall(final_data)
return()
你可以打印这个混乱的输出,看起来是正确的,Wireshark捕获显示数据包输出字面而不是ascii ...
e.g。 \x31\x32\x33\x34\x35\x0D\x0A
我已经尝试过.encode和我在Google上发现的其他一些想法...想知道为什么我无法从一个有效的变量创建一个字符串...任何帮助都将非常感激。
答案 0 :(得分:1)
A(Python2)str
是一个字节序列。例如,'\x31\x32\x33\x34\x35\x0D\x0A'
是一个字节序列。通过将list
应用于str
:
In [26]: list('\x31\x32\x33\x34\x35\x0D\x0A')
Out[26]: ['1', '2', '3', '4', '5', '\r', '\n']
所以你看,这里你真的有8个字节。 '\x31'
只是一个字节。
因此,您无法通过将反斜杠字符str
与"\\"
字符以及数字字符相关联来重现此x
:
(例如原始字符串r'\x31\x32\x33\x34\x35\x0D\x0A'
。)
In [28]: list(r'\x31\x32\x33\x34\x35\x0D\x0A')[:10]
Out[28]: ['\\', 'x', '3', '1', '\\', 'x', '3', '2', '\\', 'x']
我不确定我是否理解recover_raw_data
的目的所以可能以下是错误的,但在我看来,你所需要的只是:
def recover_raw_data(data):
conn.sendall(data)
(如果这是真的,那么你完全不需要recover_raw_data
,因为conn.sendall
就足够了......)
实际上,通过使用x
编解码器进行解码,可以将文字字符串(带反斜杠和'string_escape'
字符)转换为所需的字符串:
In [30]: (r'\x31\x32\x33\x34\x35\x0D\x0A').decode('string_escape')
Out[30]: '12345\r\n'
但我真的认为你不应该这样做。您<{em>
PS。如果您展示
data
输入内容的示例,以及您希望对其执行的操作,也许我们可以建议如何修改recover_raw_data
。