c# - PHP 到 C# 的转换

标签 c# php sockets minecraft data-conversion

我已经为此工作了大约一个小时,但我无法在 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。

最佳答案

最简单的方法是使用字节数组和按位操作:

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

还值得注意的是,您的 PHP 输出实际上描述的是 25565不是 25566。如你所见here , 25566 实际上是十六进制的 63DE

关于c# - PHP 到 C# 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22454846/

相关文章:

c# - 当搜索框中的字符串为空时,CollectionViewSource 不会填充数据网格

c# - 应该尽可能使用静态方法吗?

c# - Xamarin/Mono Mac - AppStore 构建中的握手失败

sockets - 用于计时器操作的 React/Redux 和 Websockets

c# - xpath 返回字符串而不是节点列表

javascript - 用于 html、php、css 等网络代码的语法荧光笔

PHP MySQL While 循环只返回最后一行

PHP从具有范围的字符串中获取数字数组

java - Spring RestTemplate SocketException 连接在快速连续执行时重置

python - 如何在Python 3.5中的socket.sent()的字节字符串中添加\n