【问题标题】:PHP socket - Can someone explain me these functions?PHP socket - 有人可以解释一下这些功能吗?
【发布时间】: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


【解决方案1】:

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

 00000001
&00001111
=00000001

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

该 |运算符类似于 &,但它是二元或。如果任一侧有 1,则结果将是 1。0x80 是 01000000,所以

 01000000
|00000001
=01000001

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

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

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

【讨论】:

  • @Cuagau 这是来自草案之一的原始 C 代码段的 php 端口,我相信它是 Hixie-76 但它可能是第三个和当前版本,Hybi-10跨度>
  • @Cuagau ,这很好解释,谢谢。此外,您认为有没有比制作合适尺寸的框架然后为客户取消遮罩更好的方法?
猜你喜欢
  • 2019-10-24
  • 2011-02-01
  • 2021-12-06
  • 2020-08-01
  • 2023-01-18
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多