如何连接 PHP 中几个字节的位
How to concatenate bits of several bytes in PHP
我在php.net和这里的自学至今没有找到任何方法!我对 &
和 >>
或 <<
等运算符的实验我不想在这里展示 - 太尴尬了!
起点是具有整数值(始终为 8 位)的不同长度的数组。
例如:
[178, 89, 1]
他们的二进制编码等价物...
10110010, 01011001, 00000001
应该是,最低有效位在前,...
01001101, 10011010, 10000000
串联:
010011011001101010000000
谁能一步步给我解释一下过程,让我明白php中的位操作?
谢谢
Post 剧本:
我不想用字符串操作来解决问题(我可以这样做 - 但它非常慢!),而是用位操作。
<?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;
?>
使用,decbin()但是你需要0
向左填充,否则00000001
会再次变成1
。
一种方法是使用 array_reduce(),尽管您可以通过多种方式遍历数组。
<?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
可能您需要这样的东西:
<?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);
现在一步步来:
- 对于输入数组中的每个元素,我们得到第 0 位(不太重要)-
$v & 1
- 输出变量左移,为这个位提供space
$output << 1
- 位被设置到输出变量中最右边的位置
|
部分
- 我们将变量右移,所以第 1 位变为第 0
- 其余重复
我在php.net和这里的自学至今没有找到任何方法!我对 &
和 >>
或 <<
等运算符的实验我不想在这里展示 - 太尴尬了!
起点是具有整数值(始终为 8 位)的不同长度的数组。
例如:
[178, 89, 1]
他们的二进制编码等价物...
10110010, 01011001, 00000001
应该是,最低有效位在前,...
01001101, 10011010, 10000000
串联:
010011011001101010000000
谁能一步步给我解释一下过程,让我明白php中的位操作?
谢谢
Post 剧本: 我不想用字符串操作来解决问题(我可以这样做 - 但它非常慢!),而是用位操作。
<?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;
?>
使用,decbin()但是你需要0
向左填充,否则00000001
会再次变成1
。
一种方法是使用 array_reduce(),尽管您可以通过多种方式遍历数组。
<?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
可能您需要这样的东西:
<?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);
现在一步步来:
- 对于输入数组中的每个元素,我们得到第 0 位(不太重要)-
$v & 1
- 输出变量左移,为这个位提供space
$output << 1
- 位被设置到输出变量中最右边的位置
|
部分 - 我们将变量右移,所以第 1 位变为第 0
- 其余重复