Let's write β

プログラミング中にできたことか、思ったこととか

CLで指定バイトでバイナリデータ出力

ちょっとバイナリストリームとたわむれる必要がありまして、
数値を指定したbyteで入出力する必要がありました

(defun read-bytes (in number-of-bytes &key (big-endian nil))
  (if big-endian
    (loop for idx downfrom (1- number-of-bytes) downto 0
          sum (* (read-byte in)
                 (expt 2 (* 8 idx))))
    (loop for idx from 0 to (1- number-of-bytes)
          sum (* (read-byte in)
                 (expt 2 (* 8 idx))))))

(defun write-bytes (out val number-of-bytes &key (big-endian nil))
  (if big-endian
    (loop for idx downfrom (1- number-of-bytes) downto 0
          do
          (write-byte (ldb (byte 8 (* idx 8)) val) out))
    (loop for idx from 0 to (1- number-of-bytes)
          do
          (write-byte (ldb (byte 8 (* idx 8)) val) out))))

とりあえずbit-endianとlittle-endianには対応してあるつもりです。