4

我有一些 256 个十六进制字符的字符串,它们代表一系列位标志,我正在尝试将它们转换回位字符串,以便我可以使用&|等来操作它们vec。十六进制字符串被写入整数范围的大端组,这样一组 8 个字节"76543210"应该转换为 bitstring "\x10\x32\x54\x76",即最低 8 位是00001000

问题是pack''h格式一次只处理一个字节的输入,而不是 8 个字节,因此直接使用它的结果不会按正确的顺序排列。目前我正在这样做:

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

这有效,但感觉很hackish。好像应该有更干净的方法,但我的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

使用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";
于 2009-05-12T18:05:10.010 回答
0

考虑使用出色的Bit::Vector

于 2009-05-12T19:59:01.913 回答