我的代表位旗标序列十六进制字符一些256个字符的字符串,我试图将其转换回为一个比特,所以我可以用&|vec和类似操纵它们。十六进制字符串被写入整数范围的大端基团,以使得一组像"76543210" 8个字节应转化到比特串"\x10\x32\x54\x76",即最低的8位00001000

的问题是,pack的“h”格式适用于输入中的一个字节的时间,而不是8,所以从只是用它的结果直接将不会以正确的顺序。目前,我这样做:

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

其中工程,但感觉的hackish。看起来,就必须有一个更清洁的方式,但我pack福不是很强。有没有更好的办法做到这一点的翻译?

有帮助吗?

解决方案

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

其他提示

考虑使用优良位::矢量

使用六角函数把十六进制串入的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";
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top