Python套接字 - 何时是字符串而不是字符串?

时间:2013-03-04 20:14:53

标签: python sockets

使用我发现制作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上发现的其他一些想法...想知道为什么我无法从一个有效的变量创建一个字符串...任何帮助都将非常感激。

1 个答案:

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