#lang racket/base (require "bitstring.rkt") (require "bitmatch.rkt") (require "bitstitch.rkt") (require rackunit) (define (experiment-one v) (bit-string-case v ([(= 0 : bytes 2)] 'yeah) ([(f : bits 10) (: binary)] (when (and (< f 123) (>= f 100))) 'between-100-and-123) ([(f : bits 10) (: bits 6)] f) ([(f : bits 10) (: bits 6) (rest : binary)] (list f rest)))) (check-equal? (experiment-one (bytes 0 0)) 'yeah) (check-equal? (experiment-one (bytes 252 0)) 1008) (check-equal? (experiment-one (bytes 25 64)) 'between-100-and-123) (check-equal? (experiment-one (bytes 252 0 123)) (list 1008 (sub-bit-string (bytes 252 0 123) 16 24))) (check-equal? (bit-string-pack (cadr (experiment-one (bytes 252 0 123)))) (bytes 123)) (check-equal? (bit-string-pack (bit-string (1008 : bits 10) (0 : bits 6))) (bytes 252 0)) (define (pascal->string/utf-8 bs) (bit-string-case bs ([len (body : binary bytes len)] (bytes->string/utf-8 (bit-string-pack body))))) (define (string->pascal/utf-8 str) (let ((bs (string->bytes/utf-8 str))) (bit-string (bytes-length bs) (bs : binary)))) (check-equal? (pascal->string/utf-8 #"\010abcdefgh") "abcdefgh") (check-equal? (bit-string-pack (string->pascal/utf-8 "abcdefgh")) #"\010abcdefgh") (check-equal? (bit-string (49152 : big-endian)) (bytes 0)) (check-equal? (bit-string (49152 : little-endian)) (bytes 0)) (check-equal? (bit-string (49152 : bits 16 big-endian)) (bytes 192 0)) (check-equal? (bit-string (49152 : bits 16 little-endian)) (bytes 0 192)) (check-equal? (bit-string (inexact->exact 1.0)) (bytes 1)) (check-equal? (bit-string [1.0 : float]) (bytes 63 240 0 0 0 0 0 0)) (check-equal? (bit-string [1.0 : float bits 32]) (bytes 63 128 0 0)) (check-equal? (bit-string [1.0 : float little-endian]) (bytes 0 0 0 0 0 0 240 63))