3

私はこの数時間、この質問について頭を悩ませてきました。ここには似たような質問がたくさんありますが、まったく同じものはなく、私が見たテクニックはどれも機能していないようです.

プログラムの入力から生成した一連のバイト (整数) があります。それぞれが 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' が 8 つだけですよね?

ここで何が欠けていますか?

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))

上記のすべてが string を生成します10101100

于 2012-07-27T23:55:37.247 に答える