Common lisp 使用铁壳流和flexi流进行散列

Common lisp 使用铁壳流和flexi流进行散列,common-lisp,digest,ironclad,Common Lisp,Digest,Ironclad,我正在尝试在我正在开发的一个公共Lisp应用程序中散列一些字符串。sd-sha1软件包似乎不受支持,并且已经有一段时间根据CLiki页面判断,该页面建议使用Irondead。很公平 => (require 'ironclad) NIL 《铁甲》不做字符串摘要;这是在它的项目页面上作为一个有意的设计选择,我应该做的是将我的字符串转换成字节字符串并对其进行哈希处理。换句话说 => (ironclad:digest-sequence :sha1 (flexi-streams:

我正在尝试在我正在开发的一个公共Lisp应用程序中散列一些字符串。sd-sha1软件包似乎不受支持,并且已经有一段时间根据CLiki页面判断,该页面建议使用Irondead。很公平

=> (require 'ironclad)
NIL
《铁甲》不做字符串摘要;这是在它的项目页面上作为一个有意的设计选择,我应该做的是将我的字符串转换成字节字符串并对其进行哈希处理。换句话说

=> (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,默认编码是
:拉丁文
,所以我真的不确定在这个阶段该做什么

我做错了什么?如何在Common Lisp中获取SHA1摘要字符串的字符串表示形式


如果有关系的话,我正在通过Emacs+SLIME运行SBCL(apt get的版本,我相信是1.0.29)。您从
铁甲:摘要序列中获得的八位元是SHA1摘要。您需要一个表示这些字节的十六进制编码的字符串。Ironcold有一个内置的功能:
Ironcold:byte array to hex string

Man,我必须先学会阅读完整的文档,然后再询问相关内容。铁壳页面列出了上述实用程序功能。换句话说,我应该做的是
(铁壳:字节数组到十六进制字符串(铁壳:摘要序列:sha1(铁壳:ascii字符串到字节数组“Hello there”))
,而不是将flexi流引入其中(尽管如果我不处理普通ascii字符串,它可能仍然有用)。谢谢你给我指出了正确的方向。Babel也有助于将非ASCII字符串编码为八进制向量。