我有一个十六进制代码的文件,我需要从文件中的每个字节获取所有最低有效位,连接它们,将它们分成8个组,然后将这些字节转换为ASCII。我的问题是从每个字节中提取LSB。在PHP中获取最低有效位从十六进制
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
我的代码如下所示:
<?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)));
}
?>
我认为,拆分和转换部分应能正常工作,但我想我在提取LSB时犯了一个错误。有人可以提供一个如何提取LSB的例子吗?
我稍微编辑了我的代码,以便我开始读取位置1的位。然后十进制表示在ASCII范围内,脚本输出一个实际的ASCII字符。
该代码仅用于一次性目的,因此我不关心速度或优点。但我有一个问题。为什么你用索引1开始循环,如果空格仍然在$ file字符串中,它会影响吗? – 2011-05-30 20:24:47
当我写我的答案时,你的循环从0开始,并猜测我被循环定义中的预增值('++ $ i')抛出。 – 2011-05-30 20:55:06