我正在使用以下代码从一个文件读取并写入另一个文件:
#!/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位数据的东西。
1条答案
按热度按时间dnph8jn41#
bigint
杂注将数学运算符替换为返回Math:BigInt
对象的运算符,并使用它们读取数值。这不会扩展到printf
/sprintf
。当他们试图将Math::BigInt
转换为常规的perl标量整数值时,如果后者太小而无法容纳该数字(它是32位或64位的值,具体取决于您的操作系统和CPU),那么事情就不正常了。我猜你有一个32位的系统,因为我得到了相同的结果与您的样本数与bigint和常规int在64位的Perl;两者都适合64位)。使用
to_bin()
方法,并填充结果字符串: