Supported kinds of binary types include:
- Signed and unsigned integers of any octet-size, big-endian or
little-endian. Maps to lisp integers.
- Enumerated types based on any integer type. Maps to lisp symbols.
- Complex bit-field types based on any integer type. Sub-fields can
be numeric, enumerated, or bit-flags. Maps to lisp lists of symbols
- Fixed-length and null-terminated strings. Maps to lisp strings.
- Compound records of other binary types. Maps to lisp DEFCLASS classes or, when you prefer, DEFSTRUCT structs.
Typically, a complete binary record format/type can be specified in a single (nested) declaration statement. Such compound records may then be read and written with READ-BINARY and WRITE-BINARY.
Binary-types is *not* helpful in reading files with variable bit-length code-words, such as most compressed file formats. It will basically only work with file-formats based on 8-bit bytes (octets). Also, at this time no floating-point types are supported out of the box. The ieee-floats library might be useful.
Binary-types was developed by Frode Vatvedt Fjeld. Source code is available at https://github.com/frodef/binary-types. See the Debian page for information on how to get a debian-package of binary-types using common-lisp-controller.
There are some extensions to binary-types in binary-types-extra.lisp (part of Slitch). It adds support for structs with "bitfields" and for vectors. There is also a binary-rw-gen.lisp that compiles a binary-type into specialized reader- and writer- functions that are somewhat faster.
There is also a Debian package.