如何在 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 中增加十六进制字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何定位 perl 模块

我可以确保在 5.10+ 上编写的 Perl 代码可以在 5.8 上运行吗?

如何在Perl中将十六进制转换为字符串

Perl发布 5.8 版本

perl 5.8 和 5.10 之间的区别 [关闭]

Perl 5.8 从 SSH 命令获取标准输出