【问题标题】:Convert Hex to Binary and keep leading 0's Perl将十六进制转换为二进制并保持领先 0 的 Perl
【发布时间】:2018-06-05 15:19:03
【问题描述】:

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

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

编辑:使用打包和解包找到类似的答案,替换

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

【问题讨论】:

  • 欢迎来到 Stack Overflow。什么前导零?请提供minimal reproducible example 示例输入和您所指的代码。你可以edit你的问题。
  • 确实!另外,请查看tourhow-to-ask page,了解更多关于提出可以吸引高质量答案的问题。

标签: perl


【解决方案1】:

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

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

并通过在数字前面加上 0,使它像这样用 0 填充结果

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

后者给出的结果

0000000100110010

但是这些功能的文档中都包含了这些内容。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-26
      • 2016-08-28
      • 2013-07-25
      相关资源
      最近更新 更多