如何使用PHP Pack函数将整数打包到字节数组中
本文关键字:到字节 数组 整数 何使用 PHP Pack 函数 | 更新日期: 2023-09-27 18:01:52
下面的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套接字发送字节。
我已经决定要做到这一点,我必须使用包函数。
<?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));
格式"nvc*"不正确。它将生成6个字节。你应该这样做:
$binarydata = pack("c*", $value & 0x000F, ($value>>8) & 0x000F, ($value>>16) & 0x000F);
当您正在编写打包字节时,不应该这样使用该函数吗?
$binarydata = pack("CCCC", 0xFF, 0x00, 0x00, 0x00);