gpt4 book ai didi

Python套接字-什么时候字符串不是字符串?

转载 作者:太空宇宙 更新时间:2023-11-03 19:04:06 25 4
gpt4 key购买 nike

使用 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 上找到的大量其他想法...想知道为什么我无法从有效的变量创建字符串...任何帮助将不胜感激。

最佳答案

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' 都是一个字节。因此,您无法通过将反斜杠字符 "\\"x 字符以及数字字符连接来重现此 str:(例如原始字符串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 就足够了...)

<小时/>

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

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

但我真的认为你不需要这样做。在您完成这些繁琐的操作之前,您的数据似乎已经采用了正确的形式。

<小时/>PS。如果您展示了 recover_raw_data 的输入内容以及您想要对其执行的操作的示例,也许我们可以建议如何修改 recover_raw_data

关于Python套接字-什么时候字符串不是字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15210282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com