PHP和Python解包从同一个源返回不同的结果
我似乎无法从Python(我更喜欢使用)和PHP(工作正常,由网站主机编写)脚本中获得相同的数据 PHP连接到与Python脚本相同的位置 在任何人开始之前,我知道python脚本只检索一部分数据。但我甚至无法从服务器上获得模糊的相同数据 Python:PHP和Python解包从同一个源返回不同的结果,php,python,sockets,struct,unpack,Php,Python,Sockets,Struct,Unpack,我似乎无法从Python(我更喜欢使用)和PHP(工作正常,由网站主机编写)脚本中获得相同的数据 PHP连接到与Python脚本相同的位置 在任何人开始之前,我知道python脚本只检索一部分数据。但我甚至无法从服务器上获得模糊的相同数据 Python: import socket, struct host,port = 'baystation12.net', 8000 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connec
import socket, struct
host,port = 'baystation12.net', 8000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.send('status\r\n')
data = s.recv(1024)
s.close()
print 'Received:', repr(data) # >>> Received: '\x00\xc7\x00\x07\x02\xadj\x00\x00\x1c\xf6'
cache,form,listy = "",">H",[]
for i in data:
if cache != "":
listy.append(struct.unpack(form,cache+i))
else:
cache = i
print "Unpacked:",listy # >>> Unpacked: [(199,), (0,), (7,), (2,), (173,), (106,), (0,), (0,), (28,), (246,)]
text = ""
for i in listy:
text += chr(i[0])
print "Text:",text # >>> Text: Ç
#Shows up incorrectly when I try to copy it.
PHP:
你知道为什么Python在解压数据时会给出无意义的字符,而PHP会给出上述字符吗。试试listy.append(struct.unpack(form,cache+i)[0])
最终得到的是一个1元素元组列表,而不是一个数字列表
从文档中:
解开绳子(可能是用
根据给定格式包装(fmt,…)结果是一个元组
即使它只包含一项。字符串必须包含一项
格式(len(string)所需的数据量必须相等
calcsize(fmt))
在python中,您没有向服务器发送相同的查询 在python中,您正在发送
状态
在PHP中,您发送的内容类似于\x00\x83\x00\x0d\x00\x00\x00\x00\x00\x00?状态\x00
如果您将python更改为更接近PHP,那么它的效果会更好:
import socket, struct
host,port = 'baystation12.net', 8000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
senddata = "?status"
query = '\x00\x83' + struct.pack(">H", len(senddata)+6) + '\x00'*5 + senddata + '\x00'
s.send(query)
data = s.recv(1024)
print `data`
当我试过的时候,它打印出来了
'\x00\x83\x00\xe9\x06version=Baystation+12&mode=traitor&respawn=0&enter=1&vote=1&ai=1&host&players=7&player0=Kosherman&player1=Ghazkull&player2=Doug+H.+Nuts&player3=Lord+Braindead&player4=KirbyElder&player5=Master+of+Apples&player6=Cacophony&end=%23end\x00'
这看起来与PHP得到的非常相似。Erm,oops。我的问题的意思是Python给出了无意义的字符,而PHP给出了正确的结果,显示为“PHP的输出”。Python的输出显示在Python代码的注释上。
struct.unpack(fmt, string)
import socket, struct
host,port = 'baystation12.net', 8000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
senddata = "?status"
query = '\x00\x83' + struct.pack(">H", len(senddata)+6) + '\x00'*5 + senddata + '\x00'
s.send(query)
data = s.recv(1024)
print `data`
'\x00\x83\x00\xe9\x06version=Baystation+12&mode=traitor&respawn=0&enter=1&vote=1&ai=1&host&players=7&player0=Kosherman&player1=Ghazkull&player2=Doug+H.+Nuts&player3=Lord+Braindead&player4=KirbyElder&player5=Master+of+Apples&player6=Cacophony&end=%23end\x00'