make 'hex-string->bytes' public
This commit is contained in:
parent
54f283bf86
commit
fd68db2c7b
|
@ -591,27 +591,6 @@
|
||||||
(loop (add1 i))))
|
(loop (add1 i))))
|
||||||
c))
|
c))
|
||||||
|
|
||||||
(define (hex-string->bytes s)
|
|
||||||
(define (hex-digit->int c)
|
|
||||||
(let ([c (char->integer c)])
|
|
||||||
(cond [(<= (char->integer #\0) c (char->integer #\9))
|
|
||||||
(- c (char->integer #\0))]
|
|
||||||
[(<= (char->integer #\a) c (char->integer #\f))
|
|
||||||
(+ 10 (- c (char->integer #\a)))]
|
|
||||||
[(<= (char->integer #\A) c (char->integer #\F))
|
|
||||||
(+ 10 (- c (char->integer #\A)))])))
|
|
||||||
(unless (and (string? s) (even? (string-length s))
|
|
||||||
(regexp-match? #rx"[0-9a-zA-Z]*" s))
|
|
||||||
(raise-type-error 'hex-string->bytes
|
|
||||||
"string containing an even number of hexadecimal digits" s))
|
|
||||||
(let* ([c (quotient (string-length s) 2)]
|
|
||||||
[b (make-bytes c)])
|
|
||||||
(for ([i (in-range c)])
|
|
||||||
(let ([high (hex-digit->int (string-ref s (+ i i)))]
|
|
||||||
[low (hex-digit->int (string-ref s (+ i i 1)))])
|
|
||||||
(bytes-set! b i (+ (arithmetic-shift high 4) low))))
|
|
||||||
b))
|
|
||||||
|
|
||||||
;; =======================================
|
;; =======================================
|
||||||
|
|
||||||
(provide old-scramble-password
|
(provide old-scramble-password
|
||||||
|
|
|
@ -46,4 +46,15 @@ representation in the resulting string.
|
||||||
(bytes->hex-string #"turtles")
|
(bytes->hex-string #"turtles")
|
||||||
]}
|
]}
|
||||||
|
|
||||||
|
@defproc[(hex-string->bytes [str string?]) bytes?]{
|
||||||
|
|
||||||
|
Converts the given string to a byte string, where each pair of characters in
|
||||||
|
@racket[str] is converted to a single byte in the result.
|
||||||
|
|
||||||
|
@examples[
|
||||||
|
#:eval sha1-eval
|
||||||
|
(hex-string->bytes "70")
|
||||||
|
(hex-string->bytes "Af")
|
||||||
|
]}
|
||||||
|
|
||||||
@close-eval[sha1-eval]
|
@close-eval[sha1-eval]
|
||||||
|
|
|
@ -1,12 +1,16 @@
|
||||||
#lang racket/base
|
#lang racket/base
|
||||||
(require file/sha1 tests/eli-tester)
|
|
||||||
|
|
||||||
(provide tests)
|
(module+ test
|
||||||
|
(require file/sha1 rackunit)
|
||||||
(module+ main (tests))
|
|
||||||
(define (tests)
|
|
||||||
(test
|
|
||||||
;; The docs say that sha1 must return a 40-character string,
|
;; The docs say that sha1 must return a 40-character string,
|
||||||
;; and should include leading zeros.
|
;; and should include leading zeros.
|
||||||
(string-length (sha1 (open-input-string ""))) => 40
|
(check-equal? (string-length (sha1 (open-input-string ""))) 40)
|
||||||
(string-length (sha1 (open-input-string " r a c k et"))) => 40))
|
(check-equal? (string-length (sha1 (open-input-string " r a c k et"))) 40)
|
||||||
|
|
||||||
|
(check-equal? (hex-string->bytes "") (bytes))
|
||||||
|
(check-equal? (hex-string->bytes "00") (bytes 0))
|
||||||
|
(check-equal? (hex-string->bytes "Af") (bytes 175))
|
||||||
|
(define s "1234567890abcdef")
|
||||||
|
(check-equal? (bytes->hex-string (hex-string->bytes s)) s)
|
||||||
|
|
||||||
|
(check-exn exn:fail:contract? (lambda () (hex-string->bytes "1"))))
|
||||||
|
|
|
@ -31,7 +31,8 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
(provide sha1
|
(provide sha1
|
||||||
sha1-bytes
|
sha1-bytes
|
||||||
bytes->hex-string)
|
bytes->hex-string
|
||||||
|
hex-string->bytes)
|
||||||
|
|
||||||
(define 32-mask #xFFFFFFFF)
|
(define 32-mask #xFFFFFFFF)
|
||||||
|
|
||||||
|
@ -308,3 +309,24 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
(bytes-set! bstr2 (* 2 i) (digit (arithmetic-shift c -4)))
|
(bytes-set! bstr2 (* 2 i) (digit (arithmetic-shift c -4)))
|
||||||
(bytes-set! bstr2 (+ (* 2 i) 1) (digit (bitwise-and c #xF)))))
|
(bytes-set! bstr2 (+ (* 2 i) 1) (digit (bitwise-and c #xF)))))
|
||||||
(bytes->string/latin-1 bstr2)))
|
(bytes->string/latin-1 bstr2)))
|
||||||
|
|
||||||
|
(define (hex-string->bytes s)
|
||||||
|
(unless (and (string? s) (regexp-match? #px"^([[:xdigit:]]{2})*$" s))
|
||||||
|
(raise-argument-error 'hex-string->bytes
|
||||||
|
"string containing an even number of hexadecimal digits" s))
|
||||||
|
|
||||||
|
(define (hex-char->int c)
|
||||||
|
(cond ((char<=? #\0 c #\9) (- (char->integer c) (char->integer #\0)))
|
||||||
|
((char<=? #\a c #\f) (+ 10 (- (char->integer c) (char->integer #\a))))
|
||||||
|
((char<=? #\A c #\F) (+ 10 (- (char->integer c) (char->integer #\A))))))
|
||||||
|
|
||||||
|
(define bsize (/ (string-length s) 2))
|
||||||
|
(define b (make-bytes bsize))
|
||||||
|
|
||||||
|
(for ((i (in-range bsize)))
|
||||||
|
(define high (hex-char->int (string-ref s (+ i i))))
|
||||||
|
(define low (hex-char->int (string-ref s (+ i i 1))))
|
||||||
|
(bytes-set! b i (+ (arithmetic-shift high 4) low)))
|
||||||
|
|
||||||
|
b)
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,8 @@
|
||||||
|
|
||||||
(provide sha1
|
(provide sha1
|
||||||
sha1-bytes
|
sha1-bytes
|
||||||
(rename-out [r:bytes->hex-string bytes->hex-string]))
|
(rename-out [r:bytes->hex-string bytes->hex-string])
|
||||||
|
(rename-out [r:hex-string->bytes hex-string->bytes]))
|
||||||
|
|
||||||
(define _SHA_CTX-pointer _pointer)
|
(define _SHA_CTX-pointer _pointer)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user