我有一个包含 64 个二进制符号的字符串。
我需要将其转换为十进制数。如何在 perl 中做到这一点?
sub bin2dec {
return unpack("N", pack("B64", substr("0" x 64 . shift, -64)));
}
不起作用。它只转换前 32 位。
从文档中,
N An unsigned long (32-bit) in "network" (big-endian) order.
64位等价物是"Q>
"。
q A signed quad (64-bit) value.
Q An unsigned quad value.
(Quads are available only if your system supports 64-bit
integer values _and_ if Perl has been compiled to support
those. Raises an exception otherwise.)
> sSiIlLqQ Force big-endian byte-order on the type.
jJfFdDpP (The "big end" touches the construct.)
因此,您可以使用以下内容:
unpack("Q>", pack("B64", substr("0" x 64 . shift, -64)))
也就是说,以上内容是不必要的复杂。无论谁编码,可能都不知道oct
解析二进制数的能力,因为上述内容可以简化为
oct("0b" . shift)
但是如果你没有 Perl 的 64 位版本,你会怎么做呢?您需要使用某种重载数学运算的对象。你可以使用 Math::BigInt,但我怀疑它不会像 Math::Int64 那么快。
use Math::Int64 qw( string_to_int64 );
string_to_int64(shift, 2)
例如
$ perl -MMath::Int64=string_to_int64 -E'say string_to_int64(shift, 2);'
100000000000000000000000000000000
4294967296
use Math::BigInt;
my $b = Math::BigInt->new('0b1010000110100001101000011010000110100001101000011010000110100001');
print $b;
只是一个想法,而不是与您的子例程等效的代码。
这里的二进制数是任意数。使用你的。