Frage

Ich versuche, einige Zeichenfolgen in einer Common Lisp App Hash ich arbeite. Das sd-SHA1-Paket scheint nicht unterstützt zu sein, und hat seit einiger Zeit von der CLiki Seite zu urteilen, die stattdessen Ironclad verwenden schlagen. Fair enough,

=> (require 'ironclad)
NIL

Ironclad nicht tut String verdaut obwohl; dies ist auf seiner Projektseite als vorsätzliches Design Wahl gesagt, was ich eigentlich bin, ist konvertiert meinen String in einen Byte-String und Hash zu tun. 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 wirklich die oben zurück in String-Format konvertieren möchten. 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ßt 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 das Gefühl, dass das Ergebnis nicht enthalten Steuerzeichen soll. :latin nach flexi-Streams, ist die Standard-Kodierung, so dass ich wirklich bin nicht sicher, was zu diesem Zeitpunkt zu tun.

Was mache ich falsch? Wie erhalte ich eine String-Darstellung eines SHA1-verdaut Zeichenfolge in Common Lisp?

Falls es wichtig ist, ich bin mit SBCL (die Version von apt-get, was 1.0.29 glaube ich) durch Emacs + SLIME.

War es hilfreich?

Lösung

Die Oktetts Sie von ironclad:digest-sequence bekommen sind verdauen die SHA1. Sie wollen einen String mit einer hexadezimalen darstellt kodiert dieser Bytes. Ironclad hat eine Funktion, die integrierte sich in:. ironclad:byte-array-to-hex-string

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top