---
title: "Wota Format"
description: "Word Object Transfer Arrangement"
weight: 86
type: "docs"
---

Wota is a binary message format for local inter-process communication. It is similar to Nota but works at word granularity (64-bit words) rather than byte granularity. Wota arrangements are less compact than Nota but faster to arrange and consume.

Wota stands for Word Object Transfer Arrangement.

## Type Summary

| Byte | Type |
|------|------|
| `00` | Integer |
| `01` | Floating Point |
| `02` | Array |
| `03` | Record |
| `04` | Blob |
| `05` | Text |
| `07` | Symbol |

## Preambles

Every Wota value starts with a preamble word. The least significant byte contains the type. The remaining 56 bits contain type-specific data.

## Blob

A blob is a string of bits. The remaining field contains the number of bits. The number of words that follow: `floor((number_of_bits + 63) / 64)`. The first bit of the blob goes into the most significant bit of the first word. The final word is padded with 0.

Example: A blob containing 25 bits `111100001110001100100001`:

```
0000000000001904    # preamble: 25 bits, type blob
F0E3208000000000    # data (padded to 64 bits)
```

## Text

The text is a string of UTF-32 characters packed 2 per word. The remaining field contains the number of characters. The number of words that follow: `floor((number_of_characters + 1) / 2)`. The final word is padded with 0.

Example: `"cat"`:

```
0000000000000305    # preamble: 3 characters, type text
0000006300000061    # 'c' and 'a'
0000007400000000    # 't' and padding
```

## Array

An array is an ordered sequence of values. The remaining field contains the number of elements. Following the preamble are the elements, each beginning with its own preamble. Nesting is encouraged. Cyclic structures are not allowed.

Example: `["duck", "dragon"]`:

```
0000000000000202    # preamble: 2 elements, type array
0000000000000405    # text "duck": 4 chars
0000006400000074    # 'd' 't' (reversed pair order)
000000630000006B    # 'c' 'k'
0000000000000605    # text "dragon": 6 chars
0000006400000072    # 'd' 'r'
0000006100000067    # 'a' 'g'
0000006F0000006E    # 'o' 'n'
```

## Record

A record is a set of key/value pairs. Keys must be text. The remaining field contains the number of pairs.

Example: `{"ox": ["O", "X"]}`:

```
0000000000000103    # preamble: 1 pair, type record
0000000000000205    # key "ox": 2 chars
0000006F00000078    # 'o' 'x'
0000000000000202    # value: array of 2
0000000000000105    # "O": 1 char
0000004F00000000    # 'O'
0000000000000105    # "X": 1 char
0000005800000000    # 'X'
```

## Number

Numbers are represented as DEC64. To arrange an integer, shift the integer up 8 bits. The number is incorporated directly into the preamble.

Example: `7`:

```
0000000000000700    # integer 7 as DEC64
```

To arrange a floating point number, place the number in the word following the floating point preamble.

Example: `4.25`:

```
0000000000000001    # preamble: type floating point
000000000001A9FE    # DEC64 encoding of 4.25
```

Care must be taken when decoding that the least significant byte of the number is not `80` (the null exponent).

## Symbol

The remaining field contains the symbol.

Example: `[null, false, true, private, system]`:

```
0000000000000502    # array of 5
0000000000000007    # null
0000000000000207    # false
0000000000000307    # true
0000000000000807    # private
0000000000000907    # system
```
