(ns cljam.io.cram.itf8 (:require [cljam.io.util.byte-buffer :as bb])) | |
Decodes ITF-8 integer from ByteBuffer. | (defn decode-itf8 ^long [bb] (let [b (long (bb/read-ubyte bb))] (cond (zero? (bit-and b 0x80)) b (zero? (bit-and b 0x40)) (bit-or (bit-shift-left (bit-and b 0x7f) 8) (long (bb/read-ubyte bb))) (zero? (bit-and b 0x20)) (bit-or (bit-shift-left (bit-and b 0x3f) 16) (bit-shift-left (long (bb/read-ubyte bb)) 8) (long (bb/read-ubyte bb))) (zero? (bit-and b 0x10)) (bit-or (bit-shift-left (bit-and b 0x1f) 24) (bit-shift-left (long (bb/read-ubyte bb)) 16) (bit-shift-left (long (bb/read-ubyte bb)) 8) (long (bb/read-ubyte bb))) :else (unchecked-int (bit-or (bit-shift-left (bit-and b 0x0f) 28) (bit-shift-left (long (bb/read-ubyte bb)) 20) (bit-shift-left (long (bb/read-ubyte bb)) 12) (bit-shift-left (long (bb/read-ubyte bb)) 4) (bit-and (long (bb/read-ubyte bb)) 0x0f)))))) |
Decodes LTF-8 integer from ByteBuffer. | (defn decode-ltf8 ^long [bb] (let [b (long (bb/read-ubyte bb))] (cond (zero? (bit-and b 0x80)) b (zero? (bit-and b 0x40)) (bit-or (bit-shift-left (bit-and b 0x7f) 8) (long (bb/read-ubyte bb))) (zero? (bit-and b 0x20)) (bit-or (bit-shift-left (bit-and b 0x3f) 16) (bit-shift-left (long (bb/read-ubyte bb)) 8) (long (bb/read-ubyte bb))) (zero? (bit-and b 0x10)) (bit-or (bit-shift-left (bit-and b 0x1f) 24) (bit-shift-left (long (bb/read-ubyte bb)) 16) (bit-shift-left (long (bb/read-ubyte bb)) 8) (long (bb/read-ubyte bb))) (zero? (bit-and b 0x08)) (bit-or (bit-shift-left (bit-and b 0x07) 32) (bit-shift-left (long (bb/read-ubyte bb)) 24) (bit-shift-left (long (bb/read-ubyte bb)) 16) (bit-shift-left (long (bb/read-ubyte bb)) 8) (long (bb/read-ubyte bb))) (zero? (bit-and b 0x04)) (bit-or (bit-shift-left (bit-and b 0x03) 40) (bit-shift-left (long (bb/read-ubyte bb)) 32) (bit-shift-left (long (bb/read-ubyte bb)) 24) (bit-shift-left (long (bb/read-ubyte bb)) 16) (bit-shift-left (long (bb/read-ubyte bb)) 8) (long (bb/read-ubyte bb))) (zero? (bit-and b 0x02)) (bit-or (bit-shift-left (bit-and b 0x01) 48) (bit-shift-left (long (bb/read-ubyte bb)) 40) (bit-shift-left (long (bb/read-ubyte bb)) 32) (bit-shift-left (long (bb/read-ubyte bb)) 24) (bit-shift-left (long (bb/read-ubyte bb)) 16) (bit-shift-left (long (bb/read-ubyte bb)) 8) (long (bb/read-ubyte bb))) (zero? (bit-and b 0x01)) (bit-or (bit-shift-left (long (bb/read-ubyte bb)) 48) (bit-shift-left (long (bb/read-ubyte bb)) 40) (bit-shift-left (long (bb/read-ubyte bb)) 32) (bit-shift-left (long (bb/read-ubyte bb)) 24) (bit-shift-left (long (bb/read-ubyte bb)) 16) (bit-shift-left (long (bb/read-ubyte bb)) 8) (long (bb/read-ubyte bb))) :else (bit-or (bit-shift-left (long (bb/read-ubyte bb)) 56) (bit-shift-left (long (bb/read-ubyte bb)) 48) (bit-shift-left (long (bb/read-ubyte bb)) 40) (bit-shift-left (long (bb/read-ubyte bb)) 32) (bit-shift-left (long (bb/read-ubyte bb)) 24) (bit-shift-left (long (bb/read-ubyte bb)) 16) (bit-shift-left (long (bb/read-ubyte bb)) 8) (long (bb/read-ubyte bb)))))) |