事前にみんなに感謝します。
バイナリ スカラーの n 番目のバイトにアクセスしたいと思います。たとえば、すべてのファイル データを 1 つのスカラー変数で取得できます...
バイナリデータがスカラーに収集されると想像してください...
open(SOURCE, "<", "wl.jpg");
my $thisByteData = undef;
while(<SOURCE>){$thisByteData .= $_;}
close SOURCE;
$thisByteData は生のバイナリ データです。length($thisByteData) を使用すると、バイト カウントが返されるので、Perl はそれがどのくらい大きいかを認識します。私の質問は、N 番目のバイトにアクセスするにはどうすればよいですか?
補足: 私の関数は、このバイナリ スカラーを受け取ります。この関数では、N 番目のバイトにアクセスしたいと考えています。このデータの収集方法に関するヘルプはありがたいですが、私が探しているものではありません。他のプログラマーがバイナリデータを収集する方法は彼ら次第ですが、私の仕事は、渡されたときに N 番目のバイトを取得することです:)
繰り返しますが、すべての人に助けてくれてありがとう!
これまで以上に私を導いてくれた @muteW に感謝します。unpack(...) を正しく理解していないと思います。
print(unpack("N1", $thisByteData));
print(unpack("x N1", $thisByteData));
print(unpack("x0 N1", $thisByteData));
以下を返します:
4292411360
3640647680
4292411360
これらの 3 行はすべて同じ (最初の) バイトにアクセスすると仮定します。「x」を使用せずに「x」と「x$pos」のみを使用すると、予期しない結果が生じます。
私もこれを試しました...
print(unpack("x0 N1", $thisByteData));
print(unpack("x1 N1", $thisByteData));
print(unpack("x2 N1", $thisByteData));
どちらが返されます...最後のテストと同じもの...
4292411360
3640647680
4292411360
unpack の仕組みについて、間違いなく何かが欠けています。
私がこれをしたら...
print(oct("0x". unpack("x0 H2", $thisByteData)));
print(oct("0x". unpack("x1 H2", $thisByteData)));
print(oct("0x". unpack("x2 H2", $thisByteData)));
私は私が期待していたものを手に入れました...
255
216
255
oct() を使用せずに、これを自分でアンパックできませんか?
補足として、「x$pos N1」を使用すると、これらのバイト整数の 2 の補数を取得していると思います。これらを最初の 3 バイトとして期待しています。
255
216
255
皆様のご協力に改めて感謝いたします。
@brian d foy と @muteW に特に感謝します ... unpack(...) を使用してバイナリ スカラーの N 番目のバイトにアクセスする方法がわかりました。この質問とは関係のない、解決すべき新しい問題があります。もう一度、すべての助けてくれてありがとう!
これにより、望ましい結果が得られました...
print(unpack("x0 C1", $thisByteData));
print(unpack("x1 C1", $thisByteData));
print(unpack("x2 C1", $thisByteData));
unpack(...) にはたくさんのオプションがあるので、これを読んだ人は pack/unpack ドキュメントを読んで、選択したバイトデータの結果を取得することをお勧めします。また、@brian が言及した Tie オプションを使用しようとはしませんでした。コードをできるだけシンプルにしたかったのです。