質問

私はビットフラグのシーケンスを表す進文字の一部256文字の文字列を持っている、と私は&|vecなどでそれらを操作することができるように戻ってビット列に変換しようとしています。進文字列は"76543210"ような8バイトのグループ、すなわち最下位8ビットは"\x10\x32\x54\x76"あり、ビット列の00001000に変換すべきであるように、整数全体のビッグエンディアングループに書き込まれます。

問題がpackの「h」形式ではなく8よりも、一度入力の1バイトに動作することであるので、それを使用してからの結果は、直接、正しい順序ではありません。現時点では私はこれをやってます:

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

これは動作しますが、ハック感じています。そこにきれいな方法であるべきだが、私のpack-FUは非常に強力ではないように思えます。この変換を行うには良い方法はありますか?

役に立ちましたか?

解決

my $hex = "7654321076543210";  # can be as long as needed
my $bits = pack("V*", unpack("N*", pack("H*", $hex)));
print unpack("H*", $bits);  #: 1032547610325476

他のヒント

のPerlの内部表現に16進数文字列をオンにするの機能を使用してください数は、あなたのビット演算を行うと、16進文字列に戻し、それを回すために sprintfのに使用します:

#!/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";
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top