2012-06-28 159 views
1

解碼二進制數據,我得到一個UDP包,就像這樣:二郎從包

<<83,65,77,80,188,64,171,138,30,120,105,0,0,0,10,0,4,0,0,0,84,101,115,116,15,0,0,0,82,101,122,111,110,101,32,82,111,108,101,80,108,97,121,11,0,0,0,83,97,110,32,65,110,100,114,101,97,115>> 

我怎樣才能解碼包,如果我知道,我可以刪除前11個字節,12-13字節包含的量服務器上的玩家在線(字節寬度爲2),如何獲得此金額?

UPD
也許我發送不正確包...
SAMP Query
所以,我送:

<<$S,$A,$M,$P,188,64,172,136,7808:16,$i>> 

對於服務器188.64.172.136:7808,我也得到

<<83,65,77,80,188,64,172,136,30,128,105,0,0,0,10,0,4,0,0,0,84,101,115,116,15,0,0,0,82,101,122,111,110,101,32,82,111,108,101,80,108,97,121,11,0,0,0,83,97,110,32,65,110,100,114,101,97,115>> 
+0

這裏我們可以有一個計數的問題。哪兩個字節是你想要返回的?這種情況下有多少玩家?你能給出一個(簡單的)數據包結構規範嗎?還是參考? – rvirding

+0

當然,這裏是[骨幹數據包](http://wiki.sa-mp.com/wiki/Query_Mechanism#The_backbone_of_packets) – Inferno

回答

2

您可以使用bit syntax和巧妙的模式匹配得到的結果:

<<_:11/bytes, NumberOfPlayers:16/integer-big, _/binary>> = <<83,65,77,80,188,64,171,138,30,120,105,0,0,0,10,0,4,0,0,0,84,101,115,116,15,0,0,0,82,101,122,111,110,101,32,82,111,108,101,80,108,97,121,11,0,0,0,83,97,110,32,65,110,100,114,101,97,115>>, 
NumberOfPlayers. 
+0

不起作用。我得到0,真正的在線是29 :)這是SAMP的查詢機制:[link](http://wiki.sa-mp.com/wiki/Query_Mechanism#Recieving_the_packets) – Inferno

+0

那麼,你說的字節12- 13包含在線玩家的數量。當我將它們計入包中時,我會看到零。 – Artefact2

+0

當然:d我更新了第一篇文章 – Inferno

1

如果你的數據包二進制文件存儲在P中,你可以做一些事情(like big endian):

<<NumberOfPlayersOnline:16/big>> = binary:part(P,11,2). 

結果在NumberOfPlayers

+0

也不行,我得到<<0,0>> – Inferno

+2

那麼,在你上面顯示的二進制文件中,字符12和13是'<<0,0>>',所以這是預期的:) –

+0

確實,我已經更新了第一篇文章... – Inferno