2012-03-07 34 views
2

我有一個腳本,連接到礦井工藝服務器,接收數據包,併發送數據包。Python解析Minecraft包

因此,我發送一個'登錄'數據包,並收到'登錄'數據包。不幸的是,接收到的登錄數據包是編碼的(關於編碼的信息在這裏:http://wiki.vg/Protocol#0x01)。

接收到的登錄數據包存儲在名爲received_login_packet的變量中。我需要解碼它,以便我可以獲得單獨的數據位,例如數據包類型,尺寸等等。去做這件事。

下面是一些代碼,如果有幫助:

#encoding the packet to send 
encuserlen = str(len(enc_user)) # enc_user is just my username 
packfmt = '>bih%sshiibBB' % encuserlen 
packetbytes = struct.pack(packfmt, 1, 28, len(data['user']), enc_user, 0, 0, 0, 0, 0, 0) 
s.send(packetbytes) 
time.sleep(2) 
#login packet sent, waited for response 
response = s.recv(1024) #this is the raw login response. 
#it's encoded as detailed above. i want to decode it 

任何幫助,將不勝感激,並請不要猶豫地說,如果它不夠清晰。

+0

這還不夠清楚。請包括代碼示例。 – Will 2012-03-07 14:22:18

+0

還好嗎?我添加了一些代碼,雖然沒有太多需要。大部分所需的信息都在wiki頁面中。 – Jack 2012-03-07 14:59:23

回答

0

所以,如果我明白這個權利,你想解碼數據包響應,這是一個1024字節,以獲得正確的信息。看起來你能夠使用struct.pack語句,有類似的語句來解包,如the documentation所示。基本上,它看起來像這樣。

packfmt = '>issiibBB' 
output=struct.unpack(packfmt,response) 

而且,我不太相信,你的請求被正確發送,但我會離開,作爲一個練習,你要弄清楚如何設置。請參閱format strings

+0

這並不完全正確,但我意識到我的問題並不清楚,它幫助我解決了如何解開它們的問題。 – Jack 2012-03-07 22:07:54

+0

哦,你認爲我犯了什麼錯誤?我似乎無法找到它。 :/ – Jack 2012-03-07 22:08:16

+0

@JackBeePee:'packfmt ='> bih%sshiibBB''看起來不太合適...... – PearsonArtPhoto 2012-03-08 01:24:41