2010-10-10 20 views
7

Tôi đang cố gắng băm một số chuỗi trong ứng dụng Common Lisp mà tôi đang làm việc. Gói sd-sha1 dường như không được hỗ trợ, và đã được một số thời gian đánh giá bởi trang CLiki, cho thấy sử dụng Ironclad thay thế. Đủ công bằng,Đâm với dây sắt và các dòng flexi

=> (require 'ironclad) 
NIL 

Ironclad không thực hiện phân tích chuỗi; điều này được nêu trên trang dự án của nó như là một sự lựa chọn thiết kế có chủ ý, những gì tôi phải làm là chuyển đổi chuỗi của tôi thành một chuỗi byte và băm đó. Nói cách khác

=> (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, bây giờ điều này là quan điểm toàn bộ excercise này là để thoát khỏi một chuỗi sha1-băm của đầu vào chuỗi gốc, có nghĩa là tôi thực sự muốn chuyển đổi trên trở lại định dạng chuỗi. Nhưng,

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

Tùy chọn khác là để flexi-streams suy ra mã hóa chính xác.

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

Loại công việc nào, nhưng tôi cảm thấy kết quả không được chứa các ký tự điều khiển. Theo linh hoạt, mã hóa mặc định là :latin, vì vậy tôi thực sự không chắc chắn phải làm gì ở giai đoạn này.

Tôi đang làm gì sai? Làm thế nào để có được một chuỗi đại diện của một chuỗi SHA1-tiêu hóa trong Common Lisp?

Trong trường hợp quan trọng, tôi đang chạy SBCL (phiên bản nằm ngoài apt-get, tức là 1.0.29 tôi tin) thông qua Emacs + SLIME.

Trả lời

9

Các octet bạn nhận được từ ironclad:digest-sequence thông báo SHA1. Bạn muốn một chuỗi đại diện cho một bảng mã thập lục phân của những byte đó. Ironclad có một chức năng để làm điều đó được xây dựng trong: ironclad:byte-array-to-hex-string.

+1

Người đàn ông, tôi phải học cách đọc tài liệu hoàn chỉnh trước khi tôi hỏi về nội dung. Trang Ironclad liệt kê các chức năng tiện ích ở trên. Nói cách khác, những gì tôi nên làm là '(ironclad: byte-array-to-hex-chuỗi (ironclad: chuỗi tiêu hóa: sha1 (ironclad: ascii-string-to-byte-array" Hello there "))) ' thay vì đưa dòng linh hoạt vào trong này (mặc dù nó có thể vẫn hữu ích nếu tôi không xử lý các chuỗi ascii đơn giản). Cám ơn đã chỉ tôi hướng đi đúng. – Inaimathi

+0

Babel cũng hữu ích cho việc mã hóa các chuỗi không phải ASCII thành các vector octet. – Xach

Các vấn đề liên quan