在Perl中将分组的十六进制字符转换为位串

时间:2009-05-12 17:12:48

标签: perl endianness pack bitstring

我有一些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不是很强大。有没有更好的方法来进行这种翻译?

3 个答案:

答案 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