4

ビット フラグのシーケンスを表す 16 進文字の 256 文字の文字列があり、それらをビット文字列に変換して&|vecなどで操作できるようにしようとしています。16 進文字列は、整数幅のビッグ エンディアン グループに書き込まれます。たとえば、8 バイトのグループがビット文字列 に"76543210"変換されます。"\x10\x32\x54\x76"つまり、最下位の 8 ビットは00001000です。

問題は、pack" h" 形式が一度に 8 バイトではなく 1 バイトの入力に対して機能するため、直接使用しただけでは正しい順序で結果が得られないことです。現時点では、私はこれをやっています:

my $bits = pack("h*", join("", map { scalar reverse $_ } unpack("(A8)*", $hex)));

これは機能しますが、ハックな感じがします。もっときれいな方法があるはずですが、私のpack-fu はあまり強くありません。この翻訳を行うためのより良い方法はありますか?

4

3 に答える 3

5
my $hex = "7654321076543210";  # can be as long as needed
my $bits = pack("V*", unpack("N*", pack("H*", $hex)));
print unpack("H*", $bits);  #: 1032547610325476
于 2009-05-12T18:15:03.283 に答える
0

16進関数を使用して、16進文字列をPerlの数値の内部表現に変換し、ビット単位の演算を実行し、sprintfを使用して16進文字列に戻します。

#!/usr/bin/perl

use strict;
use warnings;

my $hex = "76543210";
my $num = hex $hex;

$num &= 0xFFFF00FF; # Turn off the third byte

my $new_hex = sprintf("%08x", $num);

print "It was $hex and is now $new_hex.\n";
于 2009-05-12T18:05:10.010 に答える
0

優れたBit::Vectorの使用を検討してください。

于 2009-05-12T19:59:01.913 に答える