2010-10-10 5 views
7

Ich versuche, einige Saiten in einer gemeinsamen Lisp-App zu hacken, an der ich arbeite. Das Paket sd-sha1 scheint nicht unterstützt zu werden und wird seit einiger Zeit von der CLiki-Seite beurteilt, die stattdessen die Verwendung von Ironclad vorschlägt. Fair genug,Hashing mit Ironclad und Flexi-Streams

=> (require 'ironclad) 
NIL 

Ironclad tut String-Verdaus obwohl nicht; Dies wird auf der Projektseite als eine intentionale Design-Wahl angegeben, was ich tun soll, ist, meine Zeichenkette in eine Byte-Zeichenkette umzuwandeln und diese zu hashen. Mit anderen Worten

=> (ironclad:digest-sequence 
     :sha1 (flexi-streams:string-to-octets "Hello there")) 
#(114 108 118 85 62 26 63 222 162 145 52 243 110 106 242 234 5 236 92 206) 

Ok, jetzt ist es, was der Sinn dieser ganzen Übung ist es, einen SHA1-Hash-String des ursprünglichen String-Eingang raus, was bedeutet, dass ich in wirklich die oben konvertieren möchten zurück Zeichenfolgenformat Aber

=> (flexi-streams:octets-to-string 
    (ironclad:digest-sequence 
     :sha1 (flexi-streams:string-to-octets "Hello there")) 
    :external-format :utf-8) 

This sequence can't be decoded using UTF-8 as it is too short. 
1 octet missing at then end. 
    [Condition of type FLEXI-STREAMS:EXTERNAL-FORMAT-ENCODING-ERROR] 

Restarts: 
    0: [ABORT] Exit debugger, returning to top level. 

Die andere Option ist flexi-streams schließen die richtige Codierung zu lassen.

=> (flexi-streams:octets-to-string 
     (ironclad:digest-sequence 
     :sha1 (flexi-streams:string-to-octets "Hello there"))) 
"rlvU>?Þ¢4ónjòêì\\Î" 

Welche Art von Arbeiten, aber ich habe das Gefühl, dass das Ergebnis Steuerzeichen nicht enthalten soll. Laut Flexi-Streams ist die Standardcodierung :latin, daher bin ich mir nicht sicher, was ich in diesem Stadium tun soll.

Was mache ich falsch? Wie bekomme ich eine String-Repräsentation einer SHA1-verdauten Zeichenfolge in Common Lisp?

Wenn es darauf ankommt, ich bin SBCL (die Version aus apt-get, die 1.0.29 ist glaube ich) durch Emacs + SLIME.

Antwort

9

Die Oktette, die Sie von ironclad:digest-sequenceerhalten, sind der SHA1-Digest. Sie möchten eine Zeichenfolge, die eine hexadezimale Codierung dieser Bytes darstellt. Ironclad hat eine eingebaute Funktion: ironclad:byte-array-to-hex-string.

+1

Mann, ich muss lernen, die komplette Dokumentation zu lesen, bevor ich nach Sachen frage. Die Ironclad-Seite listet die obigen Utility-Funktionen auf. Mit anderen Worten, was ich hätte tun sollen, war '(galleryclad: byte-array-zu-hex-string (eisenclad: digest-sequenz: sha1 (eisenclad: ascii-string-zu-byte-array" Hallo da "))) ' anstelle von Flexi-Streams in diese (obwohl es wahrscheinlich immer noch nützlich wäre, wenn ich nicht mit einfachen ASCII-Strings). Danke, dass Sie mich in die richtige Richtung weisen. – Inaimathi

+0

Babel ist auch hilfreich für die Codierung von Nicht-ASCII-Strings zu Oktett-Vektoren. – Xach