【问题标题】:Cannot decode! Invalid Base58 Character(s)!无法解码!无效的 Base58 字符!
【发布时间】:2018-05-06 05:23:03
【问题描述】:

我正在尝试跑步 base58perl.pl 在我的终端中使用以下命令:

perl base58perl.pl

但我收到以下错误:

Cannot decode! Invalid Base58 Character(s)!

代码如下:

my $fileSrc = 'base58.txt';
open my $fhSrc, $fileSrc or die "Could not open $fileSrc: $!";

my $fileDest = 'hex.txt';
open( my $fhDest, '>>', $fileDest) or die "Could not open file $fileDest: $!";

while ( my $base58_encoded_address = <$fhSrc >)  {   
    my $binary_address = decodebase58tohex($base58_encoded_address);
    say $fhDest $binary_address;
}

close $fhSrc;
close $fhDest;

base58.txt的内容是base58形式的BTC地址列表。

我也试过

chmod a+x base58perl.pl
perl base58perl.pl

base58.txt 内容:

1E5PBfSaFawBy1RjBHkS6FDtCwXkYSsVTo
1DCgptTS2uY2occbVdW1qcVT72T75RXbyg
1CUNEBjYrCn2y1SdiUMohaKUi4wpP326Lb 

我仍然遇到同样的错误。

【问题讨论】:

  • decodebase58tohex函数来自哪里? CPAN的一些模块?还是你自己写的?错误信息非常清楚。您的输入有缺陷。
  • 谷歌搜索找到了我lenschulwitz.com/b58/base58perl.txt,它实现了一个具有该名称的函数。
  • edit 并在您的问题中包含 base58.txt 的内容。
  • @simbabque 代码最初来自here
  • 不。这不是我们在这里所做的。对不起。

标签: perl hash base58


【解决方案1】:

该错误消息来自您链接的代码中的unbase58 函数。

die "Cannot Decode! Invalid Base58 Character(s)!\n" unless $bitcoin_address =~ /^[1-9A-HJ-NP-Za-km-z]*$/;

该行检查输入是否仅包含字符组[1-9A-HJ-NP-Za-km-z] 的字符。既然你的输入是这样,它一定不喜欢别的东西。

我的猜测是它不喜欢行尾的换行符。在将值传递给decodebase58tohex 之前,您需要先关闭它们chomp

while( my $base58_encoded_address = <$fhSrc>)  {   
    chomp $base58_encoded_address;
    my $binary_address = decodebase58tohex($base58_encoded_address);
    say $fhDest $binary_address;
}

【讨论】:

  • 是的,我包含了chomp,但它返回相同的错误。
  • @Quin 那么您的数据中包含其他内容。文件是否来自不同的操作系统?也许它有 Windows 行尾,而你在 Linux 上?使用图形编辑器手动将其复制/粘贴到新文件中。这通常有助于修复行尾。
  • 将尝试在 Windows 上安装 Perl 并检查它是否会返回一些好的结果。
  • @QuinNoaj 就是为此做了大量的工作。相反,看看你是否可以隐藏行尾。
  • 对不起,什么是行尾?我尝试在 cmd 中运行脚本,但出现了不同的错误Can't locate object method "say"
【解决方案2】:

您可能需要删除空格。您似乎一次只将字符串的一部分传递给 decode 函数,这也可能是一个问题。将整个文件读入一个 var,删除所有空格,然后解码。

my $base58_encoded_address = do { local $/; <$fhSrc> };
$base58_encoded_address =~ s/\s+//g;
my $binary_address = decodebase58tohex($base58_encoded_address);
say $fhDest $binary_address;

【讨论】:

  • 感谢这有点工作(没有错误),但抛出一个相同的十六进制输出。
  • 与什么输出相同?你是否暗示你认为输出是错误的?这是一个问题吗?我看到您仍然没有解决您的问题以提供一个最小的、可运行的问题演示(请参阅minimal reproducible example)。
  • 该文件中的每一行代表一条记录,我相信他们想分别转换每条记录。
【解决方案3】:
my $fileSrc = 'base58.txt';
open my $fhSrc, $fileSrc or die "Could not open $fileSrc: $!";

my $fileDest = 'hex.txt';
open( my $fhDest, '>>', $fileDest) or die "Could not open file $fileDest: $!";

my @tmp = <$fhSrc>;
chomp @tmp;
for my $line (@tmp)  {   
    print "decoding '$line'\n";
    my $binary_address = decodebase58tohex($line);
    say $fhDest $binary_address;
}

close $fhSrc;
close $fhDest;

正如其他人提到的,我认为您在处理空格。 chomp 会为你解决这个问题。

接下来要做的是用引号打印您尝试解码的字符串,这将确认您只解码您想要的内容。

【讨论】:

    【解决方案4】:

    脚本现在可以正常工作,问题是base58.txt 文件是使用记事本创建的。我使用不同的文本编辑器创建了一个新文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      相关资源
      最近更新 更多