Erlang解码数据包中的二进制数据

时间:2012-06-28 09:39:58

标签: erlang udp decode packet

我得到一个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>>

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:1)

如果您的数据包二进制文件存储在P中,您可以执行类似的操作(假设为大端):

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

结果位于NumberOfPlayers