perl 限制为可以从文件中读取的十六进制值的最大值

jjhzyzn0  于 2023-05-07  发布在  Perl
关注(0)|答案(1)|浏览(190)

我正在使用以下代码从一个文件读取并写入另一个文件:

#!/usr/bin/perl
use bigint qw/hex/;
use strict;
use warnings;

my $defaultfile = 'C:/Users/john/Desktop/input.txt';
my $mainfile ='C:/Users/john/Desktop/output.txt';

open( my $default_fh, "<", $defaultfile ) or die $!;
open( my $main_fh,    ">", $mainfile )    or die $!;
while ( <$default_fh> ) {
    chomp;
    printf {$main_fh} "%064b\n" , hex $_;
    printf {$main_fh} "\n";
}
close $default_fh;
close $main_fh;

当十六进制值非常大时,比如说0x000880000000000,对应的二进制值是错误的。但是当源文件中的十六进制值较小时,比如说0x0000000088000000,那么二进制输出是正确的。
我哪里做错了?看起来我需要将数据读入能够处理64位数据的东西。

dnph8jn4

dnph8jn41#

bigint杂注将数学运算符替换为返回Math:BigInt对象的运算符,并使用它们读取数值。这不会扩展到printf/sprintf。当他们试图将Math::BigInt转换为常规的perl标量整数值时,如果后者太小而无法容纳该数字(它是32位或64位的值,具体取决于您的操作系统和CPU),那么事情就不正常了。我猜你有一个32位的系统,因为我得到了相同的结果与您的样本数与bigint和常规int在64位的Perl;两者都适合64位)。
使用to_bin()方法,并填充结果字符串:

#!/usr/bin/env perl
use warnings;
use strict;
use bigint; # Don't need to explicitly import hex in modern perl

while (<DATA>) {
    chomp;
    my $num = hex $_;
    printf "%s becomes %064s\n", $_, $num->to_bin();
}

__DATA__
0x0008800000000000
0x0000000088000000

相关问题