Welcome to the CHICKEN Scheme pasting service

Is this base64 encoding done right? pasted by C-Keen on Mon May 30 21:10:47 2011


(use binary-parse data-structures)
(define hash "f1d2d2f924e986ac86fdf7b36c94bcdf32beec15")
(define alphabet "0123456789-+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")

(define (make-byte-reader str)
  (let ((str (string->list str)))
    (lambda ()
      (cond ((null? str) #f)
	    (else (let ((b (car str)))
		    (set! str (cdr str))
		    (char->integer b)))))))

(define (hash->numbers h)
  (define (hash-converter br l s)
    (cond ((= 0 l) (reverse s))
	  ((< l 12) (hash-converter br 0 (cons (br l) s)))
	  (else (hash-converter br (- l 12) (cons (br 12) s)))))
  (let ((l (* 4 (string-length h)))
	(br (make-bit-reader (make-byte-reader h))))
    (hash-converter br l '())))

(define (string->base64 s)
  (string-concatenate
   (map (lambda (n) (let* ((rem (modulo n 64))
			   (ts (floor (/ (- n rem) 64))))
		      
		      (if (> ts 0) (string
				    (string-ref alphabet ts)
				    (string-ref alphabet rem))
			  (string (string-ref alphabet rem)))))
	(hash->numbers s))))

(string-length hash) ;; 40
(string-length (string->base64 hash)) ;; 27 (/ 320 12) = 26.6666...

conversion done right, I hope added by C-Keen on Mon May 30 21:28:12 2011

(use binary-parse data-structures)
(define hash "f1d2d2f924e986ac86fdf7b36c94bcdf32beec15")
(define alphabet "0123456789-+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")

(define (make-byte-reader str)
  (let ((str (string->list str)))
    (lambda ()
      (cond ((or (null? str)
		 (null? (cdr str))) #f)
	    (else (let ((a (car str))
			(b (cadr str)))
		    (set! str (cddr str))
		    (string->number (string a b) 16)))))))

(define (hash->numbers h)
  (define (hash-converter br l s)
    (cond ((= 0 l) (reverse s))
	  ((< l 12) (hash-converter br 0 (cons (br l) s)))
	  (else (hash-converter br (- l 12) (cons (br 12) s)))))
  (let ((l (* 4 (string-length h)))
	(br (make-bit-reader (make-byte-reader h))))
    (hash-converter br l '())))

(define (string->base64 s)
  (string-concatenate
   (map (lambda (n) (let* ((rem (modulo n 64))
			   (ts (floor (/ (- n rem) 64))))
		      
		      (if (> ts 0) (string
				    (string-ref alphabet ts)
				    (string-ref alphabet rem))
			  (string (string-ref alphabet rem)))))
	(hash->numbers s))))

(string-length hash) ;; 40
(string-length (string->base64 hash)) ;; 27 (/ 320 12) = 26.6666...

Your annotation:

Enter a new annotation:

Your nick:
The title of your paste:
Your paste (mandatory) :
Proper ... recursion is required by the Scheme specification.
Visually impaired? Let me spell it for you (wav file) download WAV