2011-12-01 39 views
4

我似乎無法從Python(我更喜歡使用)和PHP(它工作正常,由網站主機編碼)腳本中隱藏相同的數據。PHP和Python解壓返回來自同一個源的不同結果

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:

#!/usr/bin/php 
<?php 
function export($addr,$port,$str) 
{ 
    if($str{0} != "?") $str = ("?" . $str); 
    $query = "\x00\x83" . pack("n",strlen($str)+6) . "\x00\x00\x00\x00\x00" . $str . "\x00"; 
    $server = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or exit('Unable to create export socket; ' . socket_strerror(socket_last_error())); 
    socket_connect($server,$addr,$port) or exit('Unable to establish socket connection; ' . socket_strerror(socket_last_error())); 
    $bytessent = 0; 
    while($bytessent < strlen($query)) 
    { 
     $result = socket_write($server,substr($query,$bytessent),strlen($query)-$bytessent); 
     if($result === FALSE) return('Unable to transfer requested data; ' . socket_strerror(socket_last_error())); 
     $bytessent += $result; 
    } 
    $resbuf = ''; 
    while(socket_recv($server, $message,1,0)){ 
     $resbuf .= $message; 
    if(strpos($resbuf,"&end")!=FALSE) 
     { 
     echo $resbuf; 
     socket_close($server); 
     return($resbuf); 
     } 
    echo $message; 
    }; 
    echo $resbuf."\n"; 
    socket_close($server); 
} 
export("localhost","8000","status"); 
?> 

PHP的輸出:

version=Baystation+12&mode=extended&respawn=0&enter=1&vote=1&ai=1&host&players=5&player0=CompactNinja&player1=Sick+trigger&player2=SweetJealousy&player3=Cacophony&player4=Anchorshag&end 

任何想法,爲什麼Python的拆包數據時,給出了無意義的字符,而PHP給出的以上。

回答

2

你不會發送相同的查詢到你的服務器在Python中。

在Python中你發送status

在PHP如果你改變你的Python更緊密地模仿PHP那麼它的工作原理好了很多,你發送類似\x00\x83\x00\x0d\x00\x00\x00\x00\x00\x00?status\x00

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所得到的。

+0

謝謝!這解決了它! – user1075549

0

嘗試listy.append(struct.unpack(form,cache+i)[0])

你用1元元組的列表,而不是號碼列表結束了。

從文檔:http://docs.python.org/library/struct.html#struct.unpack

struct.unpack(fmt, string) 

拆開根據給定的格式字符串(由 包大概包裝(FMT,...))。 即使它只包含一個項目,結果也是一個元組 。該字符串必須完全包含 格式所需的數據量(len(字符串)必須等於 calcsize(fmt))。

+0

呃,哎呀。我的意思是我的問題是Python給出了無意義的字符,而PHP給出了正確的結果,顯示爲「PHP的輸出」。 Python的輸出顯示在python代碼的註釋中。 – user1075549