2011-12-01 3 views
4

Python (내가 선호하는)과 PHP (웹 사이트의 호스트에 의해 코딩 된)가 모호하게 동일한 데이터를 얻을 수없는 것 같습니다 .PHP와 Python의 언팩이 같은 소스에서 다른 결과를 반환합니다.

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

데이터를 포장을 풀 때 PHP가 밖으로 제공하는 동안 파이썬, 무의미한 문자를 제공하는 이유 어떤 생각 위.

답변

2

파이썬으로 서버에 동일한 쿼리를 보내지 않습니다.

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` 
: 파이썬에서

당신은 당신이 훨씬 더 잘 작동 더 밀접하게 다음 PHP를 모방하기 위해 파이썬을 변경하면 \x00\x83\x00\x0d\x00\x00\x00\x00\x00\x00?status\x00

같은 것을 보내는 PHP에서 status

을 보내는

나는이 인쇄 된 것을 시도 할 때

'\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

당신은 1 요소 튜플의 목록 오히려보다는 번호 목록과 함께 종료하고 listy.append(struct.unpack(form,cache+i)[0])

을보십시오. 워드 프로세서

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

struct.unpack(fmt, string) 

의 포장을 풀고 주어진 형식에 따라 (아마도 팩으로 포장 (FMT, ...)) 문자열. 정확히 하나의 항목이 들어 있어도 결과는 튜플 입니다. 문자열은 정확히 형식에 필요한 데이터의 양을 포함해야합니다. len (string)은 calcsize (fmt)와 같아야합니다.

+0

Erm, oops. 필자는 파이썬이 무의미한 성격을 띄는 반면, PHP는 "PHP의 결과물"로 표시된 적절한 결과를 제공한다는 사실을 의문의 대상으로 삼았다. 파이썬의 출력은 파이썬 코드의 주석에 표시됩니다. – user1075549