PHP和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

我似乎无法从Python(我更喜欢使用)和PHP(工作正常,由网站主机编写)脚本中获得相同的数据

PHP连接到与Python脚本相同的位置

在任何人开始之前,我知道python脚本只检索一部分数据。但我甚至无法从服务器上获得模糊的相同数据

Python:

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'