从Hex获得PHP中最不重要的一点

Flo*_*fer 5 php bit-manipulation

我有一个带十六进制代码的文件,我需要从文件中的每个字节获取所有最低有效位,连接它们,将它们分成8组,然后将字节转换为ASCII.我的问题是从每个字节中提取LSB.

hex文件看起来像这样(但更长):

58 00 00 1F 58 00 00 00 00 00 00 00 00 00 00 1C 22 23 1F 26 25 1E 2C 26 20 31 2B 22 38 2F 26 42 36 25 47 37 24 49 39 22
Run Code Online (Sandbox Code Playgroud)

我的代码看起来像这样:

<?php
// Read file, remove spaces
$file = implode('', explode(' ', file_get_contents('vogel.hex')));

// Save LSB
$bits = array();
for ($i = 1; $i < strlen($file); ++$i)
{
    $bits[] = $file[$i] & 1;
}

// Split LSB array into chunks of 8 bits.
$bytes = array_chunk($bits, 8);

// Implode byte arrays, convert to decimal, convert to ASCII.
foreach ($bytes as $byte)
{
echo chr(bindec(implode('', $byte)));
}
?>
Run Code Online (Sandbox Code Playgroud)

我认为分裂和转换部分应该正常工作,但我认为在提取LSB时我犯了一个错误.有人能提供一个如何提取LSB的例子吗?

我稍微编辑了我的代码,以便我开始读取位置1的位.然后十进制表示在ASCII范围内,脚本输出一个实际的ASCII字符.

Mar*_*c B 1

您可以简单地在 for 循环中构建位字符串,跳过整个数组过程:

$bits = '';
for ($i = 1; $i < strlen($file); $i++) {
    $bits .= (($file[$i] & 1) == 0) ? '0' : '1';
    if ($i % 8 == 0) {
       echo bindec($bits);
       $bits = '';
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,如果输入文件的大小不是 8 的倍数,则会有一些悬空位。