# Formaty A simple configurable binary data parser. Data structures are described using TOML files. ## Formats All formats in [formats](./formats) are included in the `formaty` binary. See [formats.md](./formats/formats.md) for more info. ## Configuration ### Format A format is a collection of fields that describe the structure of data, so it can be parsed Members: * `name` - name of the format, used as the argument when selecting the format to parse the data as * `bit_flip` - should individual bytes have their bits flipped within, individual fields can override this * `deframer` - optional list of deframers to use before trying to parse the data * `fields` - 1 or more fields to describe the structure of the data #### Field A field is a collection of bits that make up some sort of data. Formaty supports `Int`/`Uint` of arbitrary size, `Float`, `Double`, `Strings` and `Bytes`. This data does not need to be byte aligned. Members: * `name` - the name of the field, used while displaying data * `field_type` - the type of the field and associated data * `print_type` - how to print the data, if not provided it uses the default print for a type * `bit_flip` - overrides the global bit flip field, defaults to false if not provided #### Field Types * `UInt`/`Int`: standard integer types. Unsigned or signed respectively. Can be 1 or more bits. * `bit_width`: number of bits composing the integer * `endianess`: byte ordering of the field * `Float`/`Double`: Standard float point types of 32-bit or 64-bit width * `endianess`: byte ordering of the field * `String`: Collection of bytes ended by a null character '\0' * `max_len`: max length of the data * `endianess`: byte ordering of the field * `Bytes`: Collection of bytes with no termination * `max_len`: max number of bytes * `endianess`: byte ordering of the field * `Format`: Allows formats to include other formats * `format_name`: Format definition to use #### Print Types * `Base`: print out the field as of a number of `base` N * `ByteArray`: display the field as an array of bytes * `String`: view fields as a string field * `Default`: use the default printer for the source type ### Deframer A deframer configures how the data should be unpacked before being parsed. A deframer is made up of one or more DeframeOperations. Deframers can be added to `Format` configs or be applied by passing in the `--deframer` option. #### Deframe Operation * `StartSeq` - a start sequence of bytes to check for and remove before parsing * `StopSeq` - a stop sequence of bytes to check for and remove before parsing * `Replace` - a simple find and replace with Regex support. All matches of `find` are replaced with `replace` #### Example Config [Example](./formats/example.toml) ## Example ```bash ./formaty ccsds "[0xe0, 0xa1, 0xc0, 0x00, 0x00, 0x05, 0x01, 0x02, 0x03, 0x04, 0x05]" ```` Output: ``` Version Number: 0 Packet Type: 1 Secondary Header Flag: 0 APID: 0x200 Sequence Flags: 3 Packet Sequence Count: 0 Data Length: 5 Data: [1, 2, 3, 4, 5] ``` ## Help ``` Formaty 0.3.0 Arbitrary Binary Data Formatting USAGE: formaty [FLAGS] [OPTIONS] [--] [data]... FLAGS: -h, --help Prints help information -s, --stdin Input data from stdin -V, --version Prints version information OPTIONS: -b, --base Base of the input values -c, --config Path to the format config [env: FORMATY_CONFIG=] -d, --deframer ... Additional deframers to apply to the data before trying to parse it -g, --global_config Path to the global config directory [env: FORMATY_GLOBAL_CONFIG=] -f, --file Input data from file -i, --input_type Input data type [default: array] ARGS: Format to parse data as ... Raw data ``` ## License [License](./LICENSE)