【问题标题】:Conversion of PHP to C#PHP 到 C# 的转换
【发布时间】: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


【解决方案1】:

您是否正在尝试 ping 服务器?我建议使用Craft.Net,而不是尝试自己推出。

【讨论】:

  • 这对我学习套接字没有任何帮助,不过还是感谢您的建议。
  • 您从未说过您正在尝试学习套接字。这个答案解决了你的问题。
【解决方案2】:

我建议您使用此代码进行端口转换:

this.server_port.ToString("X")

它将您提供的数字转换为字符串中的十六进制表示

【讨论】:

  • 这会产生正确的输出,但它会使它成为文本而不是十六进制的 63DE。
【解决方案3】:

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

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

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

【讨论】:

  • 我认为您不能将字节数组类型转换为字符串。
  • 所以从技术上讲,我正在用 C# 模拟 php 的 pack("n", ..) 函数,这意味着大端格式的 uint16。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2021-09-30
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
相关资源
最近更新 更多