我正在尝试制作一个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转换消息的二进制表示形式,并根据消息长度创建正确大小的帧(通过连接标头)。(通过使用pack()添加字节对吗?)
揭露->反向过程。
我不明白的是:掩码中使用的$ 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?我猜想这段代码的作者是从某些0x1部分是变量的C代码中复制出来的:
byte b1 = 0x80 | (someVariable & 0x0f);
在这种情况下,二进制&和0x0f确保仅使用someVariable的后4位,b1的前4位始终为0x8(根据帧规范,这可能是必需的)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句