我正在尝试为CIDR编写IPv6代码。
Basicall,我在我的代码中获取CIDR perfix并将其转换为二进制文件。
然后在BigInt库中使用as_hex()函数,我将其转换为十六进制。
工作正常。
问题是当我尝试获取倒二进制的十六进制时。一些我怎么不能得到它,它打印出白色空间。
前缀:78
实际二进制: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000
十六进制: FFFF:FFFF:FFFF:FFFF:FFFC:0000:0000:0000
倒二进制: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111
十六进制: 3FFF:FFFF:FFFF:F ::::
任何想法????
答案 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
希望这有帮助吗?