エンディアンを変換する


Tags: R6RS, バイトベクタ

バイト列のエンディアンを変換するにはバイトベクタを介すると簡単である。

(import (rnrs))

(define (bytevector-change-endian bv from-endian to-endian size)
  (if (eq? from-endian to-endian)
      bv
      (let* ((l (bytevector-length bv))
             (rbv (make-bytevector l 0)))
        (do ((i 0 (+ i size)))
            ((>= i l) rbv)
          (bytevector-uint-set! rbv i
                                (bytevector-uint-ref bv i from-endian size)
                                to-endian
                                size)))))

(define s "abcde")

(define bv (string->utf32 s (endianness big)))
bv ; => #vu8(0 0 0 97 0 0 0 98 0 0 0 99 0 0 0 100 0 0 0 101)

(define bv2 (bytevector-change-endian bv (endianness big) (endianness little) 4))
bv2 ; => #vu8(97 0 0 0 98 0 0 0 99 0 0 0 100 0 0 0 101 0 0 0)

(utf32->string bv2 (endianness little)) ; => "abcde"