php предупреждение при попытке установить бит в строку / chr - PullRequest
0 голосов
/ 16 октября 2019

Я использовал следующий код, чтобы установить бит. Это работает нормально в php5.

function setbit($pos) {
    return (1 << $pos);  
}
$test = chr(0);
$test += setbit(2);
print_r($test);
//result 4

После обновления до php7 теперь я получаю сообщение об ошибке Предупреждение: встречается нечисловое значение. Вывод $ test по-прежнему выводится как 4, и это правильно.

Я понимаю ошибку. Это потому, что $ test является строкой, а моя функция setbit возвращает целое число. Как я уже говорил, в php5 это работало нормально, но теперь в php7 работать не будет.

$ test должен оставаться строкой, так как я выполняю некоторые строковые операции позже в коде, например

$test = chr(3);

Я знаю, что мог бы просто отключить предупреждение в php_ini, но я бы скорее решил проблему, чем скрыл ее. Есть ли способ заставить это работать в php7 без отключения предупреждения?

1 Ответ

1 голос
/ 17 октября 2019

Лучший способ установить бит в символе - создать маску, а затем использовать битовый оператор |чтобы связать символ с маской.

 /* 
  * set a bit to first char of string $str
  * @param string $str
  * @param $bitPos 0..7
  * @return string, false if error
  */  
  function setBit($str, $bitPos){
    if($bitPos < 0 OR $bitPos > 7) return false;
    return $str |= chr(1<<$bitPos);
  }

Примеры использования

$test = chr(0);
$test = setBit($test,0);
//or $test = setBit(chr(0),0);
echo bin2hex($test)."<br>\n";  //01

$test = setBit($test,1);
echo bin2hex($test)."<br>\n";  //03
...