Pregunta

Estoy tratando de hash de algunos hilos en una aplicación de Common Lisp que estoy trabajando. El paquete sd-SHA1 parece ser admitido, y ha sido durante algún tiempo a juzgar por la página cliki, lo que sugiere el uso acorazado en su lugar. Justo lo suficiente,

=> (require 'ironclad)
NIL

acorazado no lo digiere cadena sin embargo; así se haga constar en su página de proyecto como una opción de diseño intencional, lo que tengo que hacer es convertir mi cadena a un byte-cuerda y hash que. En otras palabras

=> (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, ahora la cosa es que el punto de todo este ejercicio es salir una cadena hash SHA1-de la cadena de entrada original, lo que significa que realmente quiero para convertir la parte posterior arriba en formato de cadena. Pero,

=> (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.

La otra opción es dejar que flexi-streams inferir la codificación correcta.

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

¿Qué tipo de obras, pero me da la sensación de que no se supone que el resultado de contener caracteres de control. De acuerdo con flexi-corrientes, la codificación predeterminada es :latin, así que estoy realmente seguro de qué hacer en esta etapa.

¿Qué estoy haciendo mal? ¿Cómo consigo una cadena de representación de una cadena SHA1-digerida en Common Lisp?

En caso de que importa, estoy corriendo SBCL (la versión de apt-get, que es 1.0.29 creo) a través de Emacs + BABA.

¿Fue útil?

Solución

Los octetos que recibe de ironclad:digest-sequence son el SHA1. ¿Quieres una cadena que representa una codificación hexadecimal de esos bytes. Acorazado tiene una función para hacer que una función de:. ironclad:byte-array-to-hex-string

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top