PHP套接字 - 有人能解释一下这些功能吗?

时间:2015-10-28 08:27:04

标签: php

我正在尝试创建一个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()添加字节对吗?)

取消屏蔽 - &gt;逆过程。

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

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

1 个答案:

答案 0 :(得分:4)

这条线路写起来有点奇怪,但这是正在发生的事情。 &安培;是一个二元AND运算符,它接受两个值并仅返回匹配的位。 0x1为00000001,0x0f为二进制00001111。

 00000001
&00001111
=00000001

所以(0x1和0x0f)只是0x1或1.

|运算符就像&amp;,但是是二进制OR。如果任何一方有一个1,结果将是1. 0x80是01000000,所以

 01000000
|00000001
=01000001

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

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

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