Functions for reading/writing little-endian data using InputStream/OutputStream. NOTE: This namespace is intended to be used only from within cljam, and should not be used outside cljam. | (ns cljam.io.util.lsb.io-stream (:refer-clojure :exclude [read-string]) (:require [cljam.io.util.byte-buffer :as bb] [cljam.util :refer [string->bytes]]) (:import [java.io ByteArrayOutputStream EOFException InputStream OutputStream])) |
(declare read-bytes) | |
Skips over 'length' bytes of data, discarding the skipped bytes. | (defn skip [^InputStream stream ^long length] (.skip stream length)) |
Reads 1 byte. Returns a byte value. | (defn read-byte [^InputStream stream] (unchecked-byte (.read stream))) |
Reads 1 byte. Returns an unsigned byte value as long. | (defn read-ubyte [^InputStream stream] (bit-and (.read stream) 0xFF)) |
Reads 2 bytes. Returns a short value. | (defn read-short [^InputStream stream] (let [bb (bb/allocate-lsb-byte-buffer 2)] (read-bytes stream (.array bb) 0 2) (.getShort bb))) |
Reads 2 bytes. Returns an unsigned short value as long. | (defn read-ushort [^InputStream stream] (bit-and (short (read-short stream)) 0xFFFF)) |
Reads 4 bytes. Returns an int value. | (defn read-int [^InputStream stream] (let [bb (bb/allocate-lsb-byte-buffer 4)] (read-bytes stream (.array bb) 0 4) (.getInt bb))) |
Reads 4 bytes. Returns an unsigned int value as long. | (defn read-uint [^InputStream stream] (bit-and (int (read-int stream)) 0xFFFFFFFF)) |
Reads 8 bytes. Returns a long value. | (defn read-long [^InputStream stream] (let [bb (bb/allocate-lsb-byte-buffer 8)] (read-bytes stream (.array bb) 0 8) (.getLong bb))) |
Reads 4 bytes. Returns a float value. | (defn read-float [^InputStream stream] (Float/intBitsToFloat (read-int stream))) |
Reads 8 bytes. Returns a double value. | (defn read-double [^InputStream stream] (Double/longBitsToDouble (read-long stream))) |
Reads 'length' bytes to buffer starting from offset bytes. Returns a new byte-array if called without buffer. | (defn read-bytes ([^InputStream stream ^long length] (let [ba (byte-array length)] (read-bytes stream ba 0 length))) ([^InputStream stream buffer ^long offset ^long length] (loop [total-read 0] (when (< total-read length) (let [n (.read stream buffer (+ offset total-read) (- length total-read))] (if (neg? n) (throw (EOFException. "Premature EOF")) (recur (+ total-read n)))))) buffer)) |
Reads 'length' bytes. Returns a String. | (defn read-string [^InputStream stream ^long length] (String. ^bytes (read-bytes stream length))) |
Reads until next null character. Returns a String without the null. | (defn read-null-terminated-string [^InputStream stream] (with-open [baos (ByteArrayOutputStream. 32)] (loop [] (let [b (.read stream)] (when-not (zero? b) (.write baos b) (recur)))) (.toString baos))) |
Writes 1 byte. | (defn write-ubyte [^OutputStream stream b] (let [bb (bb/allocate-lsb-byte-buffer)] (.putShort bb b) (.write stream (.array bb) 0 1))) |
Writes a 1-byte ascii character. | (defn write-char [^OutputStream stream b] (let [bb (bb/allocate-lsb-byte-buffer)] (.putChar bb b) (.write stream (.array bb) 0 1))) |
Writes a 2-byte short value. | (defn write-short [^OutputStream stream n] (let [bb (bb/allocate-lsb-byte-buffer)] (.putShort bb n) (.write stream (.array bb) 0 2))) |
Writes a 2-byte unsigned short value. | (defn write-ushort [^OutputStream stream n] (let [bb (bb/allocate-lsb-byte-buffer)] (.putInt bb n) (.write stream (.array bb) 0 2))) |
Writes a 4-byte integer value. | (defn write-int [^OutputStream stream n] (let [bb (bb/allocate-lsb-byte-buffer)] (.putInt bb n) (.write stream (.array bb) 0 4))) |
Writes a 4-byte unsigned integer value. | (defn write-uint [^OutputStream stream n] (let [bb (bb/allocate-lsb-byte-buffer)] (.putInt bb (unchecked-int n)) (.write stream (.array bb) 0 4))) |
Writes an 8-byte long value. | (defn write-long [^OutputStream stream n] (let [bb (bb/allocate-lsb-byte-buffer)] (.putLong bb n) (.write stream (.array bb) 0 8))) |
Writes a 4-byte float value. | (defn write-float [^OutputStream stream n] (let [bb (bb/allocate-lsb-byte-buffer)] (.putFloat bb n) (.write stream (.array bb) 0 4))) |
Writes a 8-byte double value. | (defn write-double [^OutputStream stream n] (let [bb (bb/allocate-lsb-byte-buffer)] (.putDouble bb n) (.write stream (.array bb) 0 8))) |
Writes a byte-array. | (defn write-bytes [^OutputStream stream ^bytes b] (.write stream b 0 (alength b))) |
Writes a string as a sequence of ascii characters. | (defn write-string [^OutputStream stream s] (let [data-bytes (string->bytes s)] (.write stream data-bytes 0 (alength data-bytes)))) |