Erlang Binary Packet - PullRequest
       19

Erlang Binary Packet

2 голосов
/ 25 января 2010

Я очень новичок в Erlang, и я конвертирую некоторые из моих вещей PHP, и я не могу понять это. Вот функция в PHP:

public function raw_send($string1, $string2 = NULL, $type = SERVERDATA_EXECCOMMAND) {
 $data = pack('VV', $this->get_request_id(), $type) . $string1 . chr(0) . $string2 . chr(0); // build data
 $packet = pack('V', strlen($data)) . $data;
 fwrite($this->fp, $packet, strlen($packet));
}

Это моя попытка:

raw_send(Sock, String1, String2, Type) ->
  RequestId = random:uniform(10),
  PacketData = list_to_binary([<<RequestId, Type>>, String1, 0, String2, 0]),
  DataLength = byte_size(PacketData),
  Packet = list_to_binary([<<DataLength>>, PacketData]),
  ok = gen_tcp:send(Sock, Packet).

Я пытался использовать crc32 для сравнения, pack ("VV", 1, 3) в php должен = << 1 / unsigned-little, 3 / unsigned-little >>, no?

Кроме того, спецификации того, что я пытаюсь сделать: http://developer.valvesoftware.com/wiki/Source_RCON_Protocol

Halp!

Спасибо

1 Ответ

1 голос
/ 25 января 2010

Понял, не использовал 32-битные целые числа! (Спасибо ndim @ freenode)

raw_send(Sock, String1, String2, Type) ->
    RequestId = random:uniform(10),
    String1Bin = list_to_binary(String1),
    String2Bin = list_to_binary(String2),
    PacketData = <<RequestId:32/little, Type:32/little, String1Bin/binary, 0, String2Bin/binary, 0>>,
    DataLength = byte_size(PacketData),
    Packet = <<DataLength:32/little, PacketData/binary>>,
    ok = gen_tcp:send(Sock, Packet).

Надеюсь, это кому-нибудь поможет!

...