在Perl中将字节转换为位序列(二进制)

时间:2012-07-27 23:12:39

标签: perl byte bit

在过去的几个小时里,我一直在围绕这个问题喋喋不休。这里有很多类似的问题,但没有什么相同的,我见过的技术似乎都没有用。

我有一个字节序列(整数),我是从程序中的输入生成的 - 每个字节代表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',对吧?

我在这里缺少什么?

2 个答案:

答案 0 :(得分:5)

我认为你正在寻找sprintf

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

答案 1 :(得分:3)

基于注释,您实际上想要检查是否设置了字节的最低有效位。

解决方案取决于你的字节意思。

如果你有一个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