mirror of
https://github.com/simplex-chat/simplexmq.git
synced 2026-03-30 18:35:59 +00:00
40 lines
1.9 KiB
Markdown
40 lines
1.9 KiB
Markdown
# Simplex.Messaging.Encoding
|
|
|
|
> Binary wire-format encoding for SMP protocol transmission.
|
|
|
|
**Source**: [`Encoding.hs`](../../../../src/Simplex/Messaging/Encoding.hs)
|
|
|
|
## Overview
|
|
|
|
`Encoding` is the binary wire format — fixed-size or length-prefixed, no delimiters between fields. Contrast with [Simplex.Messaging.Encoding.String](./Encoding/String.md) which is the human-readable, space-delimited, base64url format used in URIs and logs.
|
|
|
|
The two encoding classes share some instances (`Char`, `Bool`, `SystemTime`) but differ fundamentally: `Encoding` is self-delimiting via length prefixes, `StrEncoding` is delimiter-based (spaces, commas).
|
|
|
|
## ByteString instance
|
|
|
|
**Length prefix is 1 byte.** Maximum encodable length is 255 bytes. If a ByteString exceeds 255 bytes, the length silently wraps via `w2c . fromIntegral` — a 300-byte string encodes length as 44 (300 mod 256). Callers must ensure ByteStrings fit in 255 bytes, or use `Large` for longer values.
|
|
|
|
## Large
|
|
|
|
2-byte length prefix (`Word16`). Use for ByteStrings that may exceed 255 bytes. Maximum 65535 bytes.
|
|
|
|
## Maybe instance
|
|
|
|
Tags are ASCII characters `'0'` (0x30) and `'1'` (0x31), not bytes 0x00/0x01. `Nothing` encodes as the single byte 0x30; `Just x` encodes as 0x31 followed by `smpEncode x`.
|
|
|
|
## Tail
|
|
|
|
Consumes all remaining input. Must be the last field in any composite encoding — placing it elsewhere silently eats subsequent fields.
|
|
|
|
## Tuple instances
|
|
|
|
Sequential concatenation with no separators. Works because each element's encoding is self-delimiting (length-prefixed ByteString, fixed-size Word16/Word32/Int64/Char, etc.). If an element type isn't self-delimiting, the tuple won't round-trip.
|
|
|
|
## SystemTime
|
|
|
|
Only seconds are encoded (as Int64); nanoseconds are discarded on encode and set to 0 on decode.
|
|
|
|
## smpEncodeList / smpListP
|
|
|
|
1-byte length prefix for lists — same 255-item limit as ByteString's 255-byte limit.
|