Преобразование PHP в C#


Я работаю над этим уже около часа, и мне не удается собрать uint16 в нужном формате на C#.

PHP:

$data = "\x00"; //packet id
$data .= "\x04"; //protocol version
$data .= pack('c', strlen($server_address)) . $server_address; //server address
$data .= pack('n', $server_port); //server port
$data .= "\x01"; //next state

$data = pack('c', strlen($data)) . $data;

return $data;

C#:

string packet_id = "\x00";
string protocol_version = "\x04";
string server_address = new string(new char[] { Convert.ToChar(this.server_address.Length) }) + this.server_address;
//byte[] port_array = BitConverter.GetBytes((ushort)this.server_port);
//Array.Reverse(port_array);
string server_port = Convert.ToString((ushort)this.server_port);
string next_state = "\x01";

string final = packet_id + protocol_version + server_address + server_port + next_state;
final = new string(new char[] { Convert.ToChar(final.Length) }) + final;

Результаты в шестнадцатеричном виде следующие: PHP:

12 00 04 0C 31 39 38 2E 32 37 2E 38 33 2E 33 35 63 DE 01

C#:

15 00 04 0C 31 39 38 2E 32 37 2E 38 33 2E 33 35 32 35 35 36 36 01

Как вы можете видеть, порт сервера (25566) составляет 63 DE в PHP, но 32 35 35 36 36 в C#.

Author: John Dong, 2014-03-17

3 answers

Самый простой способ сделать это - с помощью массива байтов и побитовых операций:

byte[] data = new byte[] {
    (byte) (((ushort) this.server_port) >> 8),
    (byte) ((ushort) this.server_port)
};
string server_port = (string) data;

Также стоит отметить, что ваш вывод PHP на самом деле отображает 25565, нет 25566. Как вы можете видеть здесь, 25566 на самом деле 63DE в шестнадцатеричном формате.

 1
Author: DaveRandom, 2014-03-17 13:14:35

Я предлагаю вам использовать этот код для преобразования порта:

this.server_port.ToString("X")

Он преобразует число, которое вы дали, в шестнадцатеричное представление в строке

 0
Author: tyburam, 2014-03-17 13:19:34

Вы пытаетесь проверить связь с сервером? Я предлагаю использовать Craft.Net , вместо того, чтобы пытаться свернуть свой собственный.

 0
Author: Drew DeVault, 2014-03-17 20:22:41