3

在过去的几个小时里,我一直在思考这个问题。这里有很多类似的问题,但没有完全相同的问题,而且我见过的所有技术似乎都没有奏效。

我有一个从程序中的输入生成的字节序列(整数)——每个字节代表 BMP 图像中像素的红色、绿色或蓝色值。我本质上需要提取每个字节的比特流表示;也就是那个字节的二进制序列。

我一直在使用 and 的许多不同变体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',对吧?

我在这里想念什么?

4

2 回答 2

5

我认为您正在寻找sprintf

sub convertToBinary {
  return sprintf '%08b', shift;
}
于 2012-07-27T23:18:46.657 回答
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

于 2012-07-27T23:55:37.247 回答