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.
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
Babel ist auch hilfreich für die Codierung von Nicht-ASCII-Strings zu Oktett-Vektoren. – Xach