gpt4 book ai didi

PHP 套接字 - 有人能给我解释一下这些函数吗?

转载 作者:行者123 更新时间:2023-12-02 04:16:32 26 4
gpt4 key购买 nike

我正在尝试制作一个 php 套接字服务器,我发现两个函数可以屏蔽和取消屏蔽文本消息(框架)。我想我不太明白它是如何工作的。这是功能:

//encode message for transfer to client
function mask($text)
{
$b1 = 0x80 | (0x1 & 0x0f);
$length = strlen($text);

if ($length <= 125)
$header = pack('CC', $b1, $length);
elseif ($length > 125 && $length < 65536)
$header = pack('CCn', $b1, 126, $length);
elseif ($length >= 65536)
$header = pack('CCNN', $b1, 127, $length);

return $header . $text;
}

//unmask incoming framed message
function unmask($text)
{
$length = ord($text[1]) & 127;
if ($length == 126) {
$masks = substr($text, 4, 4);
$data = substr($text, 8);
} elseif ($length == 127) {
$masks = substr($text, 10, 4);
$data = substr($text, 14);
} else {
$masks = substr($text, 2, 4);
$data = substr($text, 6);
}
$text = "";
for ($i = 0; $i < strlen($data); ++$i) {
$text .= $data[$i] ^ $masks[$i % 4];
}

return $text;
}

我认为我已经理解了:

mask 转换消息的二进制表示形式,并根据消息长度创建正确大小的帧(通过连接 header )。 (通过使用 pack() 添加字节,对吧?)

取消屏蔽 -> 逆向过程。

我不明白的是:mask 中使用这个变量 $b1 的目的是什么?我不清楚这段代码的语法。

$b1 = 0x80 | (0x1 & 0x0f);

最佳答案

这样写这行有点奇怪,但这是发生的事情。 & 是一个二元 AND 运算符,它接受两个值并仅返回匹配的位。 0x1 是二进制的 00000001,0x0f 是 00001111。

 00000001
&00001111
=00000001

所以 (0x1 & 0x0f) 只是 0x1 或 1。

|运算符类似于 &,但是二元 OR。如果任何一方都有 1,则结果将为 1。0x80 是 01000000,所以

 01000000
|00000001
=01000001

所以总结果是0x81。为什么不直接写 $b1 = 0x81 呢?我猜测这段代码的作者是从一些 C 代码中复制的,其中 0x1 部分是一个变量:

byte b1 = 0x80 | (someVariable & 0x0f);

在这种情况下,带有 0x0f 的二进制 & 确保仅使用 someVariable 的最后 4 位,并且 b1 的前 4 位将始终为 0x8(根据帧规范,这可能是必需的)。

关于PHP 套接字 - 有人能给我解释一下这些函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33386098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com