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字符.
您可以简单地在 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 的倍数,则会有一些悬空位。