1

使用我发现的一些代码来使用 Python 套接字来制作 telnet 服务器。服务器代码工作正常。我需要向/从客户端发送十六进制字符串来逃避字符问题。当我像这样向客户端发送数据时:

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

例如\x31\x32\x33\x34\x35\x0D\x0A

我已经尝试了 .encode 和我在 Google 上找到的大量其他想法......想知道为什么我不能从有效的变量创建字符串......任何帮助将不胜感激。

4

1 回答 1

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'

但我真的不认为你应该这样做。在您完成这个繁琐的过程之前,您data似乎已经处于正确的状态。


PS。如果您展示了输入的recover_raw_data外观示例以及您想要对其执行的操作,也许我们可以建议如何修改recover_raw_data.

于 2013-03-04T20:38:42.650 回答