For a value *V*, we write «*V*» for the binary encoding of *V*.
{:.postcard-grammar.binarysyntax}
«`#f`» | = | `80`
«`#t`» | = | `81`
{:.postcard-grammar.binarysyntax}
«`@`*W* *V*» | = | `85` «*W*» «*V*»
«`#!`*V*» | = | `86` «*V*»
{:.postcard-grammar.binarysyntax}
«*V*» | = | `87``04` **binary32**(*V*) | if *V* ∈ Float
«*V*» | = | `87``08` **binary64**(*V*) | if *V* ∈ Double
{:.postcard-grammar.binarysyntax}
«*V*» | = | `B0` **varint**(|**intbytes**(*V*)|) **intbytes**(*V*) | if *V* ∈ SignedInteger
«*V*» | = | `B1` **varint**(|**utf8**(*V*)|) **utf8**(*V*) | if *V* ∈ String
«*V*» | = | `B2` **varint**(|*V*|) *V* | if *V* ∈ ByteString
«*V*» | = | `B3` **varint**(|**utf8**(*V*)|) **utf8**(*V*) | if *V* ∈ Symbol
{:.postcard-grammar.binarysyntax}
«`<`*L* *F*1 ... *F*m`>`» | = | `B4` «*L*» «*F*1» ... «*F*m» `84`
«`[`*X*1 ... *X*m`]`» | = | `B5` «*X*1» ... «*X*m» `84`
«`#{`*E*1 ... *E*m`}`» | = | `B6` «*E*1» ... «*E*m» `84`
«`{`*K*1`:`*V*1 ... *K*m`:`*V*m`}`» | = | `B7` «*K*1» «*V*1» ... «*K*m» «*V*m» `84`
{:.postcard-grammar.binarysyntax}
**varint**(*n*) | = | *n* | if *n* < 128
| | (*n* & 127) | 128 **varint**(*n* >> 7) | if *n* ≥ 128
{:.postcard-grammar.binarysyntax}
**intbytes**(*n*) | = | the empty sequence if *n* = 0, otherwise **signedBigEndian**(*n*)
{:.postcard-grammar.binarysyntax}
**signedBigEndian**(*n*) | = | *n* & 255 | if −128 ≤ *n* ≤ 127
| | **signedBigEndian**(*n* >> 8) *n* & 255 | otherwise
The functions **binary32**(*F*) and **binary64**(*D*) yield big-endian 4- and 8-byte
IEEE 754 binary representations of *F* and
*D*, respectively.