【发布时间】:2015-10-28 08:27:03
【问题描述】:
我正在尝试制作一个 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() 添加字节对吗?)
unmask -> 反向过程。
我不明白的: 这个变量 $b1 在掩码中使用的目的是什么?这段代码的语法对我来说不是很清楚。
$b1 = 0x80 | (0x1 & 0x0f);
【问题讨论】:
-
有问题的代码是 bitmask,表示 0x80(=128 十进制)或(0x1 和 0x0f)。它检查是否设置了这些位。
-
非常感谢@Jan,我现在更清楚了!
标签: php