【发布时间】:2012-07-27 23:12:39
【问题描述】:
在过去的几个小时里,我一直在思考这个问题;这里有很多类似的问题,但没有完全相同,而且我见过的技术似乎都没有奏效。
我有一个字节序列(整数),这些字节是从程序中的输入生成的——每个字节代表 BMP 图像中像素的红色、绿色或蓝色值。我本质上需要提取每个字节的比特流表示;也就是那个字节的二进制序列。
我一直在使用pack() 和unpack() 的许多不同变体,但我没有得出正确的结果。
例如:
sub convertToBinary {
my $str = unpack("B32", pack("N", shift));
return $str;
}
我也试过了:
my $str = unpack("b8", shift);,
my $str = unpack("B8", shift);,
my $str = unpack("b*", shift);
还有许多其他变体;他们似乎都没有工作。我不觉得提取一个字节的位模式应该太难了..只有八个'1'或'0',对吧?
我在这里错过了什么?
【问题讨论】:
-
你能给出可能的输入和期望输出的具体例子吗?
-
当然 - 这会有所帮助。目标是找到在 .BMP 中编码的字符 - 速记练习。 .BMP 中的每个像素都有一个红色、绿色和蓝色值,每个值都用一个代码字节表示。在每个字节中,最低有效位将设置为零,然后使用新值编码作为消息的一部分。我主要有我需要的东西,但我很难提取每个字节的按位值。
-
您不想要位表示。您可以使用按位
&检查是否设置了位。也就是说,您的输入仍然非常模糊 -
好吧,我会尽量具体一点。我的输入是一个 .BMP 文件。整个文件。我读了它,并使用
$offset = unpack("L", substr($bmp, 10, 4));来查找实际像素数据的开始位置。所以它是一个字符串开头。然后,在for循环中,我使用$byte = unpack("CCC",substr($bmp, $offset + $counter, 1));拉出每个字节 - 所以我最终得到一个代表红色、绿色数量的三个字符(或 3 个数字,我不确定)的值,或某个像素的蓝色。我正在尝试将包含该值的字节转换为位序列,以便查找隐藏字符 -
虽然很有可能在该步骤之前的某个地方我做了一些导致我丢失编码到每个字节中的消息位