Inspired by cl-mongo.
* (ql:quickload :cl-intbytes)
; => (:CL-INTBYTES)
* (use-package :intbytes)
; => TFor easy/ready encoding/decoding, use int32->octets/octets->int32 and int64->octets/octets->int64. All accept an &optional (start 0) value:
* (int32->octets 84215045)
; => #(5 5 5 5)
* (octets->int32 *)
; => 84215045
* (octets->int32 #(0 5 5 5 5) 1)
; => 84215045
* (int64->octets 578437695752307201)
; => #(1 2 3 4 5 6 7 8)
* (octets->int64 *)
; => 578437695752307201For unsigned values, there are equivalent unsigned functions octets->uint32 and octets->uint64:
* (int32->octets -123)
; => #(133 255 255 255)
* (octets->uint32 *)
; => 4294967173
* (int64->octets -1)
; => #(255 255 255 255 255 255 255 255)
* (octets->uint64 *)
; => 18446744073709551615
* (octets->int64 **)
; => -1You can create your own functions with int->octets and octets->int:
* (defun int16->octets (int16)
(int->octets int16 2))
; => INT16->OCTETS
* (defun octets->int16 (array &optional (start 0))
(octets->int array 2 start))
; => OCTETS->INT16
* (defun octets->uint16 (array &optional (start 0))
(octets->uint array 2 start))
; => OCTETS->UINT16
* (int16->octets -3)
; => #(253 255)
* (octets->uint16 *)
; => 65533
* (octets->int16 **)
; => -3
* (octets->int16 #(0 253 255) 1)
; => -3If you want to encode floats to bytes, use ieee-floats:
* (int64->octets (ieee-floats:encode-float64 1.5d0))
; => #(0 0 0 0 0 0 248 63)
* (ieee-floats:decode-float64 (octets->int64 *))
; => 1.5d0This library depends on fast-io.
The test package uses the prove test library.
cl-intbytes is used by cl-BSON.
(ql:quickload :cl-intbytes)If you find any bug or inconsistency in the code, or if you find it too hard to use, please, feel free to open an issue.
This library is tested under SBCL and CCL Common Lisp implementations.
To run all the defined tests, use:
* (asdf:test-system :cl-intbytes)
; prints lots of (colorful) stuff...
; => TTests are ran with Travis CI and Circle CI using cl-travis, CIM, cl-coveralls and Roswell. Check it out!