bindef

bindef is a DSL and command-line tool for building binary files.

It's inspired by t2b, but with a few crucial differences:

  • bindef scripts run within a Ruby process, making the DSL a strict superset of Ruby
  • Support for different (and multiple!) endians, string encodings, etc, is baked into the language
  • Reports common mistakes loudly as warnings (or errors, if severe enough)
  • Comes with a collection of user-selectable extensions for common binary formats (TLVs, control codes, etc.)

Syntax

bindef's syntax is stream-oriented, with two primary expressions: commands and pragmas.

Commands cause bindef to emit data, while pragmas influence how commands act.

Here's a simple bindef script that emits a unsigned 32-bit integer twice, in different endians:

# `bindef` starts in little-endian, so this is redundant
pragma endian: :little

u32 0xFF000000

# or `pragma :endian => :big`, if you prefer
pragma endian: :big

u32 0xFF000000

The examples directory has more. Read the SYNTAX file for a complete listing of commands and pragmas.

Installation

bindef is available via RubyGems:

$ gem install bindef
$ bd -h

You can also run it directly from this repository:

$ ruby -Ilib ./bin/bd -h

Usage

In general, running a bindef script is as simple as:

$ bd < path/to/input.bd > path/to/output.bin

or:

$ bd -i path/to/input.bd -o /path/to/output.bin

You can also choose to enable one or more extra command sets via the -e, --extra flag:

# extra commands for building TLVs
$ bd -e tlv < input.bd > output.bin

# extra commands for ASCII control codes and string manipulation
$ bd -e ctrl,string < input.bd > output.bin

Design goals

bindef should...

  • ...have no runtime dependencies other than the current stable Ruby
  • ...be easy to read, even without knowledge of Ruby's syntax
  • ...be easy to write, even without knowledge of Ruby's syntax
  • ...be easy for other programs to emit without being (too) aware of Ruby's syntax
  • ...be easy to debug, with warnings and errors for common mistakes (overflows, negative unsigned integers, etc.)