Вопрос

Я пытаюсь выбрать некоторые строки в общем приложении Lisp, над которым я работаю. Пакет SD-SHA1, похоже, неподдерживается, и в течение некоторого времени, судя по странице Клики, которая предлагает вместо этого IronClad. Справедливо,

=> (require 'ironclad)
NIL

Ironclad не делает струйные диварийные раздачи; Это указано на его странице проекта как преднамеренный выбор дизайна, я должен был преобразовать мою строку в байт-стринг и хэш. Другими словами

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

Хорошо, теперь дело в том, что точка всякого направления состоит в том, чтобы вытащить хешированную SHA1-хешированную строку исходного ввода строки, что означает, что я действительно хочу преобразовать вышеперечисленную обратно в формат строки. Но,

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

Другой вариант - позволить flexi-streams Выводите правильное кодирование.

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

Какой вид работает, но я получаю ощущение, что результат не должен содержать контрольные символы. Согласно Flexi-Streams, кодировка по умолчанию :latin, Так что я действительно не уверен, что делать на этом этапе.

Что я делаю не так? Как получить string-представление о Sha1-переваренной струны в общем Lisp?

В случае, если это имеет значение, я запускаю SBCL (версия APT-Get, которая составляет 1.0.29, я верю) через Emacs + Slime.

Это было полезно?

Решение

Октеты, от которых вы получаете ironclad:digest-sequence находятся Sha1 дайджест. Вы хотите строку, представляющую шестнадцатеричное кодирование этих байтов. IronClad имеет функцию, чтобы сделать это встроенный: ironclad:byte-array-to-hex-string.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top