2012-07-27 82 views
2

过去几个小时里,我一直在围绕这个问题猛撞我的头脑;这里有很多类似的问题,但没有什么相同的,我看到的技术似乎都没有工作。将字节转换为Perl中的二进制位序列

我有一个从我的程序中输入生成的字节序列 - 每个字节表示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);

和许多其他变化;他们中没有一个似乎在工作。我不觉得应该很难提取一个字节的bitpattern,但只有八个'1'或'0',对吧?

我在这里错过了什么?

+2

您能举出可能的输入和期望输出的具体例子吗? – cjm 2012-07-27 23:17:24

+0

当然 - 这会有所帮助。目标是找到在.BMP中编码的字符 - 在速记中进行练习。 .BMP中的每个像素都有一个红色,绿色和蓝色值,每个值都用一个字节的代码表示。在每个字节内,最低有效位将被设置为零,然后作为消息的一部分用新值进行编码。我大部分都有我需要的东西,但我很难提取每个字节的按位值。 – Nik 2012-07-28 00:25:48

+0

你不想要位表示。您可以使用按位&检查是否设置了一位。也就是说,你对你的输入仍然非常模糊 – ikegami 2012-07-28 00:32:11

回答

4

我认为你正在寻找sprintf

sub convertToBinary { 
    return sprintf '%08b', shift; 
} 
+0

工作 - 谢谢!至少,它允许我得到一个正确的二进制表示。我仍然有点卡住 - 我在上面更具体地写了它。我现在有了二进制表示,但是我不确定是否指数地丢失了未使用的位(可能存放了该消息),或者我仍然错误地提取了它。 – Nik 2012-07-28 00:27:25

3

基础上的评论,你真的想检查是否byteis的至少显著位设置。

解决方案取决于您按字节表示的含义。

如果你有一个8位字符:

if (ord("\xAC") & 0x01) 

如果你有一个8位号码:

if (0xAC & 0x01) 

原来的答复:

这听起来像你想要一个字节的二进制表示。解决方案取决于你所说的字节。

如果你有一个8位字符:

unpack('B8', "\xAC") 

sprintf('%08b', ord("\xAC")) 

sprintf('%08b', unpack('C', "\xAC")) 

如果你有一个8位号码:

sprintf('%08b', 0xAC) 

unpack('B8', chr(0xAC)) 

unpack('B8', pack('C', 0xAC)) 

上述所有的生产线10101100

+0

如果我错了,可否请您更精确地指定输入和输出。 – ikegami 2012-07-28 00:04:33

+0

'sprintf'方法适用于返回二进制表示!谢谢。 – Nik 2012-07-28 00:29:54

+0

但是我仍然有一些困难;我在上面的评论中写了更多关于它的内容。有一点困惑:当我打印解压缩('B8',10);'时,它产生00110001.当我把它插入到一个转换器回到十进制时,我得到49-不知道那里发生了什么 – Nik 2012-07-28 00:32:52

相关问题