(ns cljam.io.util.byte-buffer (:refer-clojure :exclude [read-string]) (:require [cljam.util :refer [string->bytes]]) (:import [java.nio Buffer ByteBuffer ByteOrder])) | |
Creates a new little-endian byte buffer wrapping given data. | (defn make-lsb-byte-buffer ^ByteBuffer [^bytes data] (.order (ByteBuffer/wrap data) ByteOrder/LITTLE_ENDIAN)) |
Creates a new big-endian byte buffer wrapping given data. | (defn make-msb-byte-buffer ^ByteBuffer [^bytes data] (.order (ByteBuffer/wrap data) ByteOrder/BIG_ENDIAN)) |
Creates a new little-endian byte buffer with given capacity. | (defn allocate-lsb-byte-buffer (^ByteBuffer [] (.order (ByteBuffer/allocate 8) ByteOrder/LITTLE_ENDIAN)) (^ByteBuffer [size] (.order (ByteBuffer/allocate (int size)) ByteOrder/LITTLE_ENDIAN))) |
Creates a new big-endian byte buffer with given capacity. | (defn allocate-msb-byte-buffer (^ByteBuffer [] (.order (ByteBuffer/allocate 8) ByteOrder/BIG_ENDIAN)) (^ByteBuffer [size] (.order (ByteBuffer/allocate (int size)) ByteOrder/BIG_ENDIAN))) |
Skips over 'length' bytes of data, discarding the skipped bytes. | (defn skip [^ByteBuffer bb ^long length] (.position ^Buffer bb (+ (.position bb) length))) |
Reads 1 byte. Returns an unsigned byte value as long. | (defn read-ubyte [^ByteBuffer bb] (bit-and (.get bb) 0xFF)) |
Reads 2 bytes. Returns an unsigned short value as long. | (defn read-ushort [^ByteBuffer bb] (bit-and (.getShort bb) 0xFFFF)) |
Reads 4 bytes. Returns an unsigned int value as long. | (defn read-uint [^ByteBuffer bb] (bit-and (.getInt bb) 0xFFFFFFFF)) |
Reads 'length' bytes to buffer starting from offset bytes. Returns a new byte-array if called without buffer. | (defn read-bytes
([^ByteBuffer bb ^long length]
(let [ba (byte-array length)]
(.get bb ba)
ba))
([^ByteBuffer bb buffer ^long offset ^long length]
(.get bb buffer (int offset) (int length))
buffer)) |
Reads 'length' ints to buffer starting from offset ints. Returns a new int-array if called without buffer. | (defn read-ints
(^ints [bb length]
(read-ints bb (int-array length) 0 length))
(^ints [^ByteBuffer bb ^ints buffer ^long offset ^long length]
(dotimes [i length]
(aset buffer (+ offset i) (.getInt bb)))
buffer)) |
Reads 'length' bytes. Returns a String. | (defn read-string
[^ByteBuffer bb ^long length]
(let [ba (byte-array length)]
(.get bb ba)
(String. ba))) |
Reads until next null character. Returns a String without the null. | (defn read-null-terminated-string
[^ByteBuffer bb]
(let [start (.position bb)
end (do (while (not (zero? (.get bb))))
(.position bb))
offset (.arrayOffset bb)]
(String. (.array bb) (+ offset start) (dec (- end start))))) |
Writes 1 byte. | (defn write-ubyte [^ByteBuffer bb b] (.put bb (unchecked-byte b))) |
Writes a 2-byte unsigned short value. | (defn write-ushort [^ByteBuffer bb n] (.putShort bb (unchecked-short n))) |
Writes a 4-byte unsigned integer value. | (defn write-uint [^ByteBuffer bb n] (.putInt bb (unchecked-int n))) |
Writes a string as a sequence of ascii characters. | (defn write-string [^ByteBuffer bb s] (.put bb (string->bytes s))) |