perl中的as_hex()函数问题

时间:2014-12-05 19:57:38

标签: regex perl bigint

我正在尝试为CIDR编写IPv6代码。

Basicall,我在我的代码中获取CIDR perfix并将其转换为二进制文件。

然后在BigInt库中使用as_hex()函数,我将其转换为十六进制。

工作正常。

问题是当我尝试获取倒二进制的十六进制时。一些我怎么不能得到它,它打印出白色空间。

前缀:78

实际二进制: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000

十六进制: FFFF:FFFF:FFFF:FFFF:FFFC:0000:0000:0000

倒二进制: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111

十六进制: 3FFF:FFFF:FFFF:F ::::

任何想法????

1 个答案:

答案 0 :(得分:1)

我认为你需要处理前导零,as_hex似乎在默认情况下摆脱。使用您提供的两个二进制序列:

use Math::BigInt;

sub paddedHex {
  my ($binary) = @_;
  my $x = substr(Math::BigInt->new($binary)->as_hex(), 2, -1);
  return sprintf("0x%032s\n", $x);
}

my @binaries = qw/
0b11111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000

0b00000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111
/;

for my $binary (@binaries) {
  print paddedHex($binary), "\n";
}

我得到了这个输出:

0x0fffffffffffffffffffc00000000000

0x000000000000000000003fffffffffff

希望这有帮助吗?