我有一些256个字符的十六进制字符串表示一系列位标志,我正在尝试将它们转换回位串,以便我可以使用&
,|
来操作它们,vec
等。十六进制字符串以整数范围的大端组写入,这样一组8字节(如"76543210"
)应转换为位串"\x10\x32\x54\x76"
,即最低8位为00001000
。
问题是pack
的“h
”格式一次只能输入一个字节,而不是8,所以直接使用它的结果不会出现在正确的顺序。目前我正在这样做:
my $bits = pack("h*", join("", map { scalar reverse $_ } unpack("(A8)*", $hex)));
哪个有效,但感觉很乱。似乎应该有一个更清洁的方式,但我的pack
- fu不是很强大。有没有更好的方法来进行这种翻译?
答案 0 :(得分:5)
my $hex = "7654321076543210"; # can be as long as needed
my $bits = pack("V*", unpack("N*", pack("H*", $hex)));
print unpack("H*", $bits); #: 1032547610325476
答案 1 :(得分:0)
使用hex函数将十六进制字符串转换为Perl的内部数字表示,执行按位操作,并使用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";
答案 2 :(得分:0)
考虑使用优秀的Bit::Vector。