如何在 Perl 5.8 中增加十六进制字符串?
Posted
技术标签:
【中文标题】如何在 Perl 5.8 中增加十六进制字符串?【英文标题】:How can I increment a hex string in Perl 5.8? 【发布时间】:2014-01-06 19:02:37 【问题描述】:我有一个很大的十六进制数 - $num = 0x80000000
,作为字符串。
我想增加它,但由于整数溢出(结果为负数),hex($num)
不起作用。使用 bigint
也不是一个选项,因为带有 bigint 的十六进制仅在 perl 5.10 及更高版本中实现,我有 5.8。我怎样才能 ++ 这个字符串?
【问题讨论】:
0x80000000
不是字符串,而是数字。 "0x80000000"
是一个字符串。
同样"0x80000000"
在传递给hex()
时也不会溢出。
发布一个完整的工作程序,以便我们看到你在做什么。
这怎么不清楚?他说他做了$num = 0x80000000; hex($num)
并得到一个整数溢出错误。该代码不正确,并且确实导致了该错误。他还说明了他正在努力实现的目标。投票重新开放。
【参考方案1】:
不要将文字表示与数字与实际值混淆。当您进行分配时,无论您如何表示它,Perl 最终都会存储一个数字并且不再关心原始表示。对它使用正常的数字运算。当你想再看一遍时,你可以选择任何你喜欢的表现形式:
$num = 0x8000000;
$num++;
printf "%0x" $num;
你只需要hex()
,如果你将你的数字表示作为一个字符串,就像你从命令行参数中一样。您只需要hex
将字符串转换为数字。之后就一样了。
$num = hex( '8000000' ); # or hex( '0x8000000' )
# $num = hex( $ARGV[0] );
$num++;
printf "%0x" $num;
对于您问题的另一部分,bignum
在 Perl v5.8 上运行良好:
$ perl5.8.9 -le 'my $i = 0xFFFFFFFF_FFFFFFFF; $i++; print $i'
1.84467440737096e+19
$ perl5.8.9 -Mbignum -le 'my $i = 0xFFFFFFFF_FFFFFFFF; $i++; print $i'
18446744073709551616
【讨论】:
好的,谢谢。这是一个字符串,我忘记了“”。关于 bignum 问题 - 它工作正常,但没有函数hex
从十六进制字符串转换为 bigint。【参考方案2】:
我通过Perlbrew 使用 Perl 5.8.9 对此没有任何问题:
#! /usr/bin/env perl
use strict;
use warnings;
my $num = 0x80000000;
print "$num\n"; # No quotes make this a number and not a string
这会打印出2147483648
,这是0x8000000
的十进制值。
你在哪个平台上?
您可能想要做的是在 hex 中打印出这个十六进制数字,而不是十进制。你仍然可以使用++
来增加它,但是要以十六进制打印出来,你需要printf:
#! /usr/bin/env perl
#
use strict;
use warnings;
use Data::Dumper;
my $num = 0x80000000;
for my $loop (0..100)
$num++;
printf "%-20x\n", $num;
打印出来:
80000001
80000002
80000003
80000004
80000005
80000006
80000007
80000008
80000009
8000000a
...
如果0x80000000
确实是一个字符串,那么在我使用 Perl 5.8.9 的系统上使用 hex 将其转换为数字是没有问题的。
#! /usr/bin/env perl
use strict;
use warnings;
my $num = "0x80000000"; # This is a string
$num = hex $num; # Now it's a number
print "$num\n"; # Prints 2147483648 because `$num` is numeric
正如我所说。这是 Perl 5.8.9(我无法在 Perlbrew 上获得 5.8.8),这是在 Mac 上。也许您的平台有点不同。它是带有 32 位版本的 SunOS 或 Solaris 的旧 Solaris 系统吗?
我查看了 5.8.8 文档并注意到 standard 发行版确实内置了 Bigint support。它还附带了模块 Math::Bigint。
你确定你没有 Bigint 支持吗?
【讨论】:
以上是关于如何在 Perl 5.8 中增加十六进制字符串?的主要内容,如果未能解决你的问题,请参考以下文章