This commit is contained in:
Tony Garnock-Jones 2018-09-24 15:33:19 +01:00
parent a22ded2f16
commit b656df8632
1 changed files with 21 additions and 44 deletions

View File

@ -320,31 +320,26 @@ Each `Repr` takes one of three possible forms:
Applications may choose between formats B and C depending on their
needs at serialization time.
Every `Repr` starts with a *lead byte* describing the remainder of the
representation.
#### The lead byte
The lead byte is constructed by a function `leadbyte`:
Every `Repr` starts with a *lead byte*, constructed by
`leadbyte(t,n,m)`, where `t`,`n`∈{0,1,2,3} and 0≤`m`<16:
leadbyte(t,n,m) = [t*64 + n*16 + m]
Both `t` and `n` are two-bit unsigned numbers; `m` is a four-bit
unsigned number.
The lead byte describes the rest of the representation as
follows:[^some-encodings-unused]
The arguments `t` and `n` describe the rest of the
representation:[^some-encodings-unused]
[^some-encodings-unused]: Some encodings are unused. All such
encodings are reserved for future versions of this specification.
- `leadbyte(0,0,-)` (format A) represents an Atom with fixed-length binary representation.
- `leadbyte(0,1,-)` (format A) is reserved.
- `leadbyte(0,2,-)` (format C) is a Stream Start byte.
- `leadbyte(0,3,-)` (format C) is a Stream End byte.
- `leadbyte(1,-,-)` (format B) represents an Atom with variable-length binary representation.
- `leadbyte(2,-,-)` (format B) represents a Record.
- `leadbyte(3,-,-)` (format B) represents a Sequence, Set or Dictionary.
- `t`=0, `n`=0 (format A) represents an `Atom` with fixed-length binary representation.
- `t`=0, `n`=1 (format A) represents certain small `SignedInteger`s.
- `t`=0, `n`=2 (format C) is a Stream Start byte.
- `t`=0, `n`=3 (format C) is a Stream End byte.
- `t`=1 (format B) represents an `Atom` with variable-length binary representation.
- `t`=2 (format B) represents a `Record`.
- `t`=3 (format B) represents a `Sequence`, `Set` or `Dictionary`.
#### Encoding data of fixed length (format A)
@ -494,9 +489,7 @@ order.
Note that `header(3,3,m)` and `open(3,3)`/`close(3,3)` is unused and reserved.
### Variable-length Atoms
#### SignedInteger
### SignedIntegers
Format B/A (known length/fixed-size):
@ -522,32 +515,16 @@ needed to unambiguously identify the value and its sign, and `m =
For example,
[[ -257 ]] = [0x42, 0xFE, 0xFF]
[[ -256 ]] = [0x42, 0xFF, 0x00]
[[ -255 ]] = [0x42, 0xFF, 0x01]
[[ -254 ]] = [0x42, 0xFF, 0x02]
[[ -129 ]] = [0x42, 0xFF, 0x7F]
[[ -128 ]] = [0x41, 0x80]
[[ -127 ]] = [0x41, 0x81]
[[ -4 ]] = [0x41, 0xFC]
[[ -3 ]] = [0x1D]
[[ -2 ]] = [0x1E]
[[ -1 ]] = [0x1F]
[[ 0 ]] = [0x10]
[[ 1 ]] = [0x11]
[[ 12 ]] = [0x1C]
[[ 13 ]] = [0x41, 0x0D]
[[ 127 ]] = [0x41, 0x7F]
[[ 128 ]] = [0x42, 0x00, 0x80]
[[ 255 ]] = [0x42, 0x00, 0xFF]
[[ 256 ]] = [0x42, 0x01, 0x00]
[[ 32767 ]] = [0x42, 0x7F, 0xFF]
[[ 32768 ]] = [0x43, 0x00, 0x80, 0x00]
[[ 65535 ]] = [0x43, 0x00, 0xFF, 0xFF]
[[ 65536 ]] = [0x43, 0x01, 0x00, 0x00]
[[ 131072 ]] = [0x43, 0x02, 0x00, 0x00]
[[ -257 ]] = 42 FE FF [[ -3 ]] = 1D [[ 128 ]] = 42 00 80
[[ -256 ]] = 42 FF 00 [[ -2 ]] = 1E [[ 255 ]] = 42 00 FF
[[ -255 ]] = 42 FF 01 [[ -1 ]] = 1F [[ 256 ]] = 42 01 00
[[ -254 ]] = 42 FF 02 [[ 0 ]] = 10 [[ 32767 ]] = 42 7F FF
[[ -129 ]] = 42 FF 7F [[ 1 ]] = 11 [[ 32768 ]] = 43 00 80 00
[[ -128 ]] = 41 80 [[ 12 ]] = 1C [[ 65535 ]] = 43 00 FF FF
[[ -127 ]] = 41 81 [[ 13 ]] = 41 0D [[ 65536 ]] = 43 01 00 00
[[ -4 ]] = 41 FC [[ 127 ]] = 41 7F [[ 131072 ]] = 43 02 00 00
#### String, ByteString and Symbol
### Strings, ByteStrings and Symbols
Syntax for these three types varies only in the value of `n` supplied
to `header`, `open`, and `close`. In each case, the payload following