Задать вопрос
@TerritoryOfPeace
Изучаю php

Как изменить функцию маскировки данных чтобы она обрабатывала не только числа а и слова на Websocket сервере?

Есть функция маскировки данных:
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;
}

Функция демаскировки данных:
function unmask($data) {
    $length = ord($data[1]) & 127;
    $masks = substr($data, 2, 4);
    $maskedData = substr($data, 6);

    $unmaskedData = '';
    for ($i = 0; $i < strlen($maskedData); ++$i) {
        $unmaskedData .= $maskedData[$i] ^ $masks[$i % 4];
    }

    return $unmaskedData;
}


Числа обрабатывают нормально, сервер отправляет корректные данные клиентам, но любой текст возвращается как null. В чем может быть проблема?
  • Вопрос задан
  • 174 просмотра
Подписаться 2 Простой 5 комментариев
Решения вопроса 1
@legacy_js
$maskedData[$i] должен начинаться с 6 если длина <= 125
$unmaskedData .= $maskedData[тут должно быть 6] ^ $masks[$i % 4]; // а $i =0 % 4

что то типо такого
function unmask($data) {
    $length = ord($data[1]) & 127;
    $offset = 2;
    if($length == 126) {
        $offset = 4;
    } else if($length == 127) {
        $offset = 10;
    }
    $masks = substr($data, 2, 4);
    $maskedData = substr($data, 6);

    $unmaskedData = '';
    for ($i = offset + 4, $j = 0; $i < strlen($maskedData); ++$i, ++$j) {
        $unmaskedData .= $maskedData[$i] ^ $masks[$j % 4];
    }

    return $unmaskedData;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы