1

以下 C# 代码用于我继承的服务中,将一个小整数转换为 3 个字节,以便可以通过套接字发送。

int i = 12345;
byte[] data = new byte[] { (byte)i, (byte)(i >> 8), (byte)(i >> 16)};
var result = data[0] + (data[1] << 8) + (data[2] << 16);

使用 PHP,我正在打开服务的套接字。通信协议是在字节级别编写的,所以我必须通过 PHP 套接字发送字节。

我已经确定要做到这一点,我必须使用 pack 功能。

    <?php
    $binarydata = pack("CCCC", 0xFF, 0x00, 0x00, 0x00);
socket_write($sk, $binarydata, $binarydataLen);
    ?>

第一个字节告诉服务器客户端想要做什么,在这种情况下,接下来的 3 个字节必须表示一个符合上面 c# 实现中所示公式的整数。

我遇到的问题是,无论我尝试什么,我都无法从与 c# 实现匹配的整数创建 3 字节数组。

对于任何可以帮助我解决这个问题的人,我真的会给予支持和投票,对于一个有经验的 PHP 开发人员,我认为他们可能知道正确的语法来使用。

谢谢你。基督教

编辑:这是原型

//The Client
error_reporting(E_ALL);

$address = "127.0.0.1";
$port = <removed>;

/* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
} else {
    echo "socket successfully created.\n";
}

echo "Attempting to connect to '$address' on port '$port'...";
$result = socket_connect($socket, $address, $port);
if ($result === false) {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
    echo "successfully connected to $address.\n";
}

    $value = 17;
    $binarydata = pack("c*", 0xFE, $value & 0x000F, ($value>>8) & 0x000F, ($value>>16) & 0x000F);
    socket_write($socket, $binarydata, 4);
    $input = socket_read($socket, 2048);
    echo "Response from server is: $input\n";


    sleep(5);

echo "Closing socket...";
socket_close($socket);

预期输出为“FE 11 00 00”(11 为 17)

不幸的是,它根据日志发送“FE 01 00 00”:-(

服务器以 ASCII 响应,所以我只需要正确获取这个数字,因为它会动态变化。

编辑:谢谢大家,它的工作!xD

$binarydata = pack("cc*", 0xFE, $value, ($value>>8), ($value>>16));
4

2 回答 2

1

当您正在编写打包字节时,不应该这样使用该函数吗?

$binarydata = pack("CCCC", 0xFF, 0x00, 0x00, 0x00);
于 2011-07-13T12:23:27.813 回答
1

格式“nvc*”不正确。它将生成 6 个字节。你应该做这个:

    $binarydata = pack("c*", $value & 0x000F, ($value>>8) & 0x000F, ($value>>16) & 0x000F);
于 2011-07-13T12:27:49.270 回答