当字符串不是字符串时,Python套接字?

2024-05-03 14:48:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

conn.sendall('\x74\x65\x73\x74\x31\x32\x33\x0D\x0A')

或者

^{pr2}$

它工作得很好。当我试图创建一个字符串并将其存储在变量中时(如下面的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

我试过了。编码和我在谷歌上找到的很多其他想法。。。想知道为什么我不能从一个有效的变量创建一个字符串。。。任何帮助都将不胜感激。在


Tags: 字符串代码服务器客户端dataitemsconnlist
1条回答
网友
1楼 · 发布于 2024-05-03 14:48:01

(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'都是一个字节。 因此,您不能通过将反斜杠字符"\\"x字符和数字字符连接起来来重现str: (例如原始字符串r'\x31\x32\x33\x34\x35\x0D\x0A'。)

^{pr2}$

我不确定我是否理解recover_raw_data的目的,所以也许下面的内容是错误的,但在我看来,您所需要的只是:

def recover_raw_data(data):
    conn.sendall(data)

(如果这是真的,那么您根本不需要recover_raw_data,因为conn.sendall就足够了…)


实际上,通过使用'string_escape'编解码器解码,可以将文本字符串(带反斜杠和x字符)转换为所需的字符串:

In [30]: (r'\x31\x32\x33\x34\x35\x0D\x0A').decode('string_escape')
Out[30]: '12345\r\n'

但我真的认为你不应该这么做。你的data在你经历这个繁琐的过程之前似乎已经是正确的形式了。在


如果您展示了一个示例,说明recover_raw_data的输入是什么样子的,以及您希望对它做什么,也许我们可以建议如何修改recover_raw_data。在

相关问题 更多 >