Как объединить биты нескольких байтов в PHP - PullRequest
0 голосов
/ 05 августа 2020

Мое самообучение в php. net и здесь пока не позволило мне найти какой-либо подход! Мои эксперименты с такими операторами, как & и >> или <<, я не хочу здесь показывать - слишком неловко!

Отправной точкой являются массивы разной длины с целочисленными значениями (всегда 8 бит) .

Так, например:

[178, 89, 1]

Их эквивалент в двоичном коде ...

10110010, 01011001, 00000001 

должен быть, сначала младший бит, ...

01001101, 10011010, 10000000

конкатенировано:

010011011001101010000000

Может ли кто-нибудь объяснить мне процедуру шаг за шагом, чтобы я понял битовые операции в php?

Спасибо

Post scriptum: Я не хочу решать проблему со строковыми операциями (я могу это сделать, но это ужасно медленно!), Но с битовыми операциями.

Ответы [ 3 ]

1 голос
/ 05 августа 2020

Используйте, decbin () , но вам нужно будет 0 оставить отступ, иначе 00000001 снова станет 1.

Один из способов сделать это - используйте array_reduce () , хотя вы можете использовать oop по массиву разными способами.

<?php
$array = [178, 89, 1];

echo array_reduce($array, function ($acc, $byte) {
   return $acc.strrev(str_pad(decbin($byte), 8, 0, STR_PAD_LEFT));
})

Результат: 010011011001101010000000

https://3v4l.org/D4qGr

1 голос
/ 06 августа 2020

вероятно вам понадобится что-то вроде этого:

<?php
$array = [178, 89, 1];

$output = 0;
foreach ($array as $v) {
    for ($i = 0; $i < 8; $i++) {
        $output = ($output << 1) | ($v & 1);
        $v = $v >> 1;
    }
}

echo $output . " " . str_pad(decbin($output), 24, 0, STR_PAD_LEFT);

теперь пошагово:

  1. для каждого элемента во входном массиве мы получаем 0-й бит (менее значимый) - $v & 1
  2. выходная переменная сдвигается влево, чтобы обеспечить место для этого бита $output << 1
  3. бит устанавливается в крайнее правое положение в выходной переменной | часть
  4. мы сдвигаем переменную вправо, поэтому 1-й бит становится 0-м
  5. повторяется для остальных
0 голосов
/ 05 августа 2020
<?php
function dec2bin_i($decimal_i)
{
 bcscale(0);

 $binary_i = '';
 do
  {
   $binary_i = bcmod($decimal_i,'2') . $binary_i;
   $decimal_i = bcdiv($decimal_i,'2');
  } while (bccomp($decimal_i,'0'));

 return($binary_i);
}
//empty output string
$output = '';
//define array
$array = [178, 89, 1];
//loop array values
foreach($array as $value){
    //convert to binary and concatenate
    $output .= dec2bin_i($value);
}
//show output
echo $output;
?>
...