Go to file
2020-04-30 16:08:10 +02:00
laymanshex.go added factor to variable bit size -> easier offset scripting 2020-04-30 16:08:10 +02:00
LICENSE Initial commit 2020-04-26 22:57:19 +02:00
README added factor to variable bit size -> easier offset scripting 2020-04-30 16:08:10 +02:00

LaymansHex
==========

LaymansHex takes a (partial) file description and allows tinkering with
the values in a binary file. It thus serves as a sort of layman's
hex editor.


File description format
-----------------------

In EBNF:
```
description =
  { comment }
  endianness
  definition
  { definition }
.

comment = '#' { LETTER | DIGIT } '\n'.

endianness = ("little endian" | "big endian") '\n'.

definition = [ IDENT ] ':' type '\n'.

type = bytefield
  | "int8"    | "int16"  | "int32"  | "int64"
  | "uint8"   | "uint16" | "uint32" | "uint64"
  | "float32" | "float64"
.

bytefield = "byte[" ( INTEGER | IDENT [ "*" INTEGER ]) "]".
```

The identifier of a definition line can be left empty to ignore that particular value.
Portions of the binary file not covered by the file description are ignored. Byte field
size can be variable - the specific value then needs to be set at program invocation (via -fvar).


Usage
-----

To get values: `laymanshex FORMATFILE BINARY`

To set values: `laymanshex -set "key1=value1,key2=value2" FORMATFILE BINARY`

To set a variable 'offset' to 113 in the file description and get values: `laymanshex -fvar="offset=113" FORMATFILE BINARY`

Examples of format descriptions can be found in the [laymanshex-files repo](/laymanshex-files/).


Advanced
--------

The variable byte field size allows to script around laymanshex and use a sliding frame
to obtain sequences. E.g. you can define a partial file format that only covers one
element of the sequence at a certain offset:

```
little endian
      : byte[offset*32]
value : int32
```

Script:

```
#/bin/bash

for i in `seq 99`; do
  laymanshex -fvar="offset=$((i*4))" FORMATFILE BINARY
done
```

If your sequence ends with a marker, add that marker to the file description and check
its value after each invocation of laymanshex.