سؤال

أحاول تجزئة بعض الأوتار في تطبيق LISP المشترك الذي أعمل عليه. يبدو أن حزمة SD-SHA1 غير مدعومة ، وقد تم الحكم عليها لبعض الوقت من قبل صفحة Cliki ، مما يوحي باستخدام 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òêì\\Î"

أي نوع من الأعمال ، لكنني أشعر أنه من المفترض أن تحتوي النتيجة على شخصيات تحكم. وفقًا لمادة المرن ، فإن الترميز الافتراضي هو :latin, ، لذلك لست متأكدًا مما يجب فعله في هذه المرحلة.

ما الخطأ الذي افعله؟ كيف يمكنني الحصول على تمثيل سلسلة لسلسلة sha1 digested في lisp المشتركة؟

في حال كان الأمر مهمًا ، فأنا أقوم بتشغيل SBCL (الإصدار من APT-GET ، وهو 1.0.29 أعتقد) من خلال EMACS+SLIME.

هل كانت مفيدة؟

المحلول

الثمانيات التي تحصل عليها ironclad:digest-sequence نكون Digest SHA1. تريد سلسلة تمثل ترميز سداسي عشري لتلك البايتات. لدى Ironclad وظيفة للقيام بذلك المدمج: ironclad:byte-array-to-hex-string.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top