我有一个十六进制数字数组,我想将其转换为二进制数,问题是,在我的代码中它删除了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))
答案 0 :(得分:4)
您可以在sprintf
或printf
中指定输出的宽度,方法是将数字放在%和格式字符之间。
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);
...
}