【发布时间】:2014-04-22 16:28:42
【问题描述】:
我已经为此工作了大约一个小时,但我无法在 C# 中以正确的格式打包 uint16。
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) 在 PHP 中是 63 DE,但在 C# 中是 32 35 35 36 36。
【问题讨论】:
-
Doesnt "\x01" 转义 x 值吗?不应该是 @"\x01" 吗? (与其他有 x 的字符串相同)
-
C#将服务器端口写成字符串,应该写成数字
-
这是我要发送到套接字的字符串,服务器对格式非常挑剔,所以它必须准确,我无法模拟 php 的 pack("n" , "..");功能正常。
标签: c# php sockets minecraft data-conversion