将Hex转换为二进制并保持前导0的Perl

时间:2018-06-05 15:19:03

标签: perl

我有一个十六进制数字数组,我想将其转换为二进制数,问题是,在我的代码中它删除了0,1,2,3之类的前导0。我需要这些前导0来处理我的代码的未来部分。有没有一种简单的方法可以将Hex转换为二进制并将我的前导0保持在perl中?

use strict;
use warnings;
my @binary;
my @hex = ('ABCD', '0132', '2211');
foreach my $h(@hex){
my $bin = sprintf( "%b", hex($h));
push @binary, $bin;
}

foreach (@binary){
print "$_\n";
}

运行代码会给我 1010101111001101 100110010 10001000010001

编辑:使用pack和unpack找到类似的答案,替换

sprint( "%b", hex($h));unpack( 'B*', pack('H*' ($h))

2 个答案:

答案 0 :(得分:4)

您可以在sprintfprintf中指定输出的宽度,方法是将数字放在%和格式字符之间。

printf "%16b\n",hex("0132");

并且在数字前加0,使其填充结果为0,如此

printf "%016b\n",hex("0132");

后者给出

的结果
  

0000000100110010

但这些功能的文档中都涵盖了这一点。

答案 1 :(得分:1)

此解决方案使用十六进制表示的长度来确定二进制表示的长度:

for my $num_hex (@nums_hex) {
   my $num = hex($num_hex);
   my $num_bin = sprintf('%0*b', length($num_hex)*4, $num);
   ...
}