Add `bytevector->base16-string'.
authorLudovic Courtès <ludo@gnu.org>
Fri, 1 Jun 2012 21:29:55 +0000 (23:29 +0200)
committerLudovic Courtès <ludo@gnu.org>
Sun, 3 Jun 2012 21:27:18 +0000 (23:27 +0200)
* guix/utils.scm (bytevector->base16-string): New procedure.

guix/utils.scm

index ad7fe85..a5f64f9 100644 (file)
 ;;; along with Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (guix utils)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
   #:use-module (srfi srfi-60)
   #:use-module (rnrs bytevectors)
+  #:use-module (ice-9 format)
   #:use-module ((chop hash)
                 #:select (bytevector-hash
                           hash-method/sha256))
   #:export (bytevector-quintet-length
             bytevector->base32-string
             bytevector->nix-base32-string
+            bytevector->base16-string
             sha256))
 
+\f
+;;;
+;;; Base 32.
+;;;
+
 (define bytevector-quintet-ref
   (let* ((ref  bytevector-u8-ref)
          (ref+ (lambda (bv offset)
@@ -151,6 +160,35 @@ the previous application or INIT."
 (define bytevector->nix-base32-string
   (make-bytevector->base32-string bytevector-quintet-fold-right
                                   %nix-base32-chars))
+
+\f
+;;;
+;;; Base 16.
+;;;
+
+(define (bytevector->base16-string bv)
+  "Return the hexadecimal representation of BV's contents."
+  (define len
+    (bytevector-length bv))
+
+  (let-syntax ((base16-chars (lambda (s)
+                               (syntax-case s ()
+                                 (_
+                                  (let ((v (list->vector
+                                            (unfold (cut > <> 255)
+                                                    (lambda (n)
+                                                      (format #f "~2,'0x" n))
+                                                    1+
+                                                    0))))
+                                    v))))))
+    (define chars base16-chars)
+    (let loop ((i 0)
+               (r '()))
+      (if (= i len)
+          (string-concatenate-reverse r)
+          (loop (+ 1 i)
+                (cons (vector-ref chars (bytevector-u8-ref bv i)) r))))))
+
 \f
 ;;;
 ;;; Hash.