2017-11-22 13 views
2

Ich versuche base58perl.pl in meinem Terminal mit dem folgenden Befehl auszuführen:Kann nicht dekodieren! Ungültige Base58-Zeichen!

perl base58perl.pl 

aber ich bekomme die folgende Fehlermeldung:

Cannot decode! Invalid Base58 Character(s)! 

Hier ist der Code:

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; 

Der Inhalt von base58.txt ist eine Liste der BTC-Adresse in Base58-Form.

Ich habe auch

chmod a+x base58perl.pl 
perl base58perl.pl 

base58.txt Inhalt versucht:

1E5PBfSaFawBy1RjBHkS6FDtCwXkYSsVTo 
1DCgptTS2uY2occbVdW1qcVT72T75RXbyg 
1CUNEBjYrCn2y1SdiUMohaKUi4wpP326Lb 

ich immer noch die gleichen Fehler.

+1

Woher kommt die 'decodebase58tohex'Funktion? Irgendein Modul von CPAN? Oder hast du das selbst geschrieben? Die Fehlermeldung ist ziemlich klar. Ihre Eingabe ist fehlerhaft. – simbabque

+0

Ein bisschen googeln fand ich http://lenschulwitz.com/b58/base58perl.txt, das eine Funktion mit diesem Namen implementiert. – simbabque

+0

Bitte [editieren] und fügen Sie den Inhalt von _base58.txt_ in Ihre Frage ein. – simbabque

Antwort

0

Diese Fehlermeldung kommt von der Funktion unbase58 in dem Code, den Sie verknüpft haben.

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

dieser Linie überprüft, ob die Eingabe [1-9A-HJ-NP-Za-km-z] nur Zeichen der Zeichengruppe enthält. Da deine Eingabe es tut, muss es etwas anderes nicht mögen.

Meine Vermutung ist, dass es die Zeilenumbruch Zeichen am Ende Ihrer Zeilen nicht mochte. Sie müssen chomp sie aus, bevor Sie den Wert an decodebase58tohex übergeben.

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

Ja, ich habe 'chomp' eingeschlossen, aber es gibt den gleichen Fehler zurück. –

+0

@Quin Dann enthalten Ihre Daten etwas anderes. Ist die Datei von einem anderen Betriebssystem? Vielleicht hat es Windows-Zeilenenden, und Sie sind auf Linux? Kopieren Sie es manuell in eine neue Datei mit einem grafischen Editor. Das hilft oft, Zeilenenden zu fixieren. – simbabque

+0

Wird versuchen, Perl unter Windows zu installieren und prüfen, ob es einige gute Ergebnisse zurückgibt. –

0

Wahrscheinlich müssen Sie Leerräume entfernen. Sie scheinen nur Stücke der Zeichenfolge gleichzeitig an die Decodierfunktion zu übergeben, was ebenfalls ein Problem darstellen könnte. Lesen Sie die gesamte Datei in eine Variable, entfernen Sie alle Leerzeichen und dekodieren Sie sie.

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

Dank dieser Art arbeitete (kein Fehler), sondern wirft einen einzigen gleichen Hex-Ausgang. –

+0

Gleicher Ausgang wie was? Willst du damit sagen, dass die Produktion falsch ist? Ist das eine Frage? Ich sehe, dass Sie Ihre Frage immer noch nicht gelöst haben, um eine minimale, lauffähige Demonstration des Problems zu ermöglichen (siehe [mcve]). – ikegami

+0

Jede Zeile in dieser Datei stellt einen Datensatz dar, und sie wollen jeden Datensatz einzeln konvertieren, glaube ich. – simbabque

0

Das Skript jetzt richtig funktioniert, war das Problem der base58.txt die Datei mit dem Editor erstellt wurde. Ich habe eine neue Datei mit einem anderen Texteditor erstellt.

0
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; 

Als jemand anderes erwähnt, denke ich, dass Sie mit Whitespaces handeln. chomp wird sich darum kümmern.

Das nächste, was zu tun ist, drucken Sie die Zeichenfolge, die Sie versuchen, in Anführungszeichen zu dekodieren, die Ihre einzige Decodierung bestätigen wird, was Sie wollen.

Verwandte Themen