2

我有这个 udp 数据包:

P = <<83,65,77,80,188,64,172,85,30,144,105,0,0,0,50,0,7,0,0,0,115,97,109,112,45,114,112,11,0,0,0,149,78,87,149,82,80,149,118,50,46,50,11,0,0,0,83,97,110,32,65,110,100,114,101,97,115>>

14-15 byte 是 player var (Byte width - 2) 15-18 byte 是服务器主机名的长度 (Byte width - 4)
19 + strlen 是服务器的主机名 (Byte width - strlen)

我让玩家变种:

<<_:11/bytes, Players:16/integer-big, Max:16/integer-big, _/binary>> = P.

它是 50。
我怎样才能得到主机名?

4

1 回答 1

3

您可以改进表达式以获得正确的值。请注意,正如您所说,服务器长度是 32 位,并且从外观上看,它似乎是小端,而不是大端(注意名称是 7 字节,在本例中为“samp-rp” ,这些字节的编码是<<7,0,0,0>>,表示小端(可能你的玩家也是小端)。另外,你的数字似乎有点不对。表达式将是:

<<_:14/bytes, Players:16/integer-little, HNameLength:32/integer-little, HostNameBinary:HNameLength/binary, _/binary>> = P.

然后,可以将主机名从二进制文件转换为字符串binary_to_list

HostName = binary_to_list(HostNameBinary).
于 2012-06-30T17:11:51.767 回答