Professional Documents
Culture Documents
FAST Specification 1 X 1 PDF
FAST Specification 1 X 1 PDF
Version 1.x.1
2006-12-20
Status of this Document
This document specifies a standards protocol for the FIX community, and requests discussion and
suggestions for improvements.
Distribution
Distribution of this document is unlimited.
Copyright Notice
Copyright ©FIX Protocol Ltd. (2006)
Abstract
This document specifies FAST, which is a space and processing efficient encoding method for message
oriented data streams. It defines the layout of a binary representation and the semantics of a control
structure called a template. It also defines an XML syntax for concrete template definitions.
Disclaimer
THE INFORMATION CONTAINED HEREIN AND THE FINANCIAL INFORMATION
EXCHANGE PROTOCOL (COLLECTIVELY THE “FIX PROTOCOL”) ARE PROVIDED “AS IS”
AND NO PERSON OR ENTITY ASSOCIATED WITH THE FIX PROTOCOL MAKES ANY
REPRESENTATION OR WARRANTY, EXPRESS OR IMPLIED, AS TO THE FIX PROTOCOL
(OR THE RESULTS TO BE OBTAINED BY THE USE THEREOF) OR ANY OTHER MATTER
AND EACH SUCH PERSON AND ENTITY SPECIFICALLY DISCLAIMS ANY WARRANTY OF
ORIGINALITY, ACCURACY, COMPLETENESS, MERCHANTABILITY OR FITNESS FOR A
PARTICULAR PURPOSE. SUCH PERSONS AND ENTITIES DO NOT WARRANT THAT THE
FIX PROTOCOL WILL CONFORM TO ANY DESCRIPTION THEREOF OR BE FREE OF
ERRORS. THE ENTIRE RISK OF ANY USE OF THE FIX PROTOCOL IS ASSUMED BY THE
USER.
Document History
Version Date Author Description
1.x.01 2006-05-07 David Rosenborg Branched into unified specification based on TD
extended with parts of TE. Added EBNF grammar
to TE section. Added blocked encoding. Renamed
groups in TE to segments to minimize conflicts
with the other uses of that word. Formalized the
concept of stop bit encoded entities.
1.x.02 2006-05-09 David Rosenborg Initial draft release
1.x.07 2006-08-17 David Rosenberg FAST Specification 1.1 candidate release and
request for comments
1.x.09 2006-12-05 David Rosenborg Minor clarifications, additions, and inclusion of
examples
1.x.1 2006-12-20 Final version approved by the Market Data
Optimization Working Group
<templates xmlns="http://www.fixprotocol.org/ns/template-definition"
templateNs="http://www.fixprotocol.org/ns/templates/sample"
ns="http://www.fixprotocol.org/ns/fix">
<template name="MDRefreshSample">
<typeRef name="MarketDataIncrementalRefresh"/>
<string name="BeginString" id=”8”> <constant value="FIX4.4"/> </string>
<string name="MessageType" id=”35”> <constant value="X"/> </string>
<string name="SenderCompID" id=”49”> <copy/> </string>
<uInt32 name="MsgSeqNum" id=”34”> <increment/> </uInt32>
<sequence name="MDEntries">
<length name="NoMDEntries" id=”268”/>
<uInt32 name="MDUpdateAction" id=”279”> <copy/> </uInt32>
<string name="MDEntryType" id=”269”> <copy/> </string>
<string name="Symbol" id=”55”> <copy/> </string>
<string name="SecurityType" id=”167”> <copy/> </string>
<decimal name="MDEntryPx" id=”270”> <delta/> </decimal>
<decimal name="MDEntrySize" id=”271”> <delta/> </decimal>
<uInt32 name="NumberOfOrders" id=”346”> <delta/> </uInt32>
<string name="QuoteCondition" id=”276”> <copy/> </string>
<string name="TradeCondition" id=”277”> <copy/> </string>
</sequence>
</template>
</templates>
Appendix 3 contains more examples of the concrete syntax together with examples of the encoding of the
corresponding fields.
3 Notation
This document uses the compact syntax of the RELAX NG schema language [RNC] to formally define
the XML structure for template definitions. Fragments of the schema are interleaved with descriptive text.
The complete schema that is available in Appendix 1 is extensible. In the schema fragments provided in
the text, the parts related to extensibility have been left out. A W3C XML Schema [XSD] version is
provided in Appendix 2.
Errors are labeled with an error identifier in brackets.
References are labeled with the corresponding identifier from the References section in brackets.
4 Error Handling
An error that is detected by solely examining a template definition is referred to as a static error. Encoders
and decoders must signal static errors and the template where the error occurred must be discarded.
When reading template definitions from an XML document it is a static error [ERR S1] if the document
• is not well-formed as defined in Extensible Markup Language [XML],
• does not conform to the constraints in Namespaces in XML [XMLNS],
• is not valid according to the schema as specified in Appendix 1.
An error that is detected when encoding or decoding a FAST stream is referred to as either a dynamic or
reportable error. Encoders and decoders must signal dynamic errors and are encouraged to signal reportable
errors but may refrain from doing so. A typical reason for not signaling reportable errors can be to achieve
better performance. To ensure interoperability, it is however recommended that all errors are signaled
during development and testing of implementations.
5 Application Types
An application type represents a type of a group or message in the application using FAST. This document
does not specify the structure of application types and treat them as abstract entities, but assumes that
they can be mapped to the following model.
• A group is a named type comprising an unordered set of fields.
6 Templates
A template specifies how to encode an instance of an application type, or part thereof, as a stream of bytes.
Each template is identified by a name that is used when referring to a template either from the definition
of another template, or in an external context.
Templates do not constitute types in themselves but are associated with application types by reference.
There can be more than one template per application type 1 . It is also possible to create a template that can
be used for more than one application type.
A template is defined by the <td:template> element in the concrete syntax. A template definition
XML document can either contain a single template or a collection of templates. A collection of templates
must be enclosed in a <td:templates> element. This element can hold namespace attributes applicable
to the whole enclosed set of templates.
A template contains a sequence of instructions. The order of the instructions is significant and corresponds
to the order of the data in the stream. There are two categories of instructions: field instructions and template
reference instructions. Field instructions specify how to encode fields of the instance to the stream. Template
reference instructions provide means for defining parts of a template by reference to other templates.
1 Having multiple templates for the same application type makes it possible to optimize for different uses of the type. As an
example, many FIX messages contain a wide variety of fields where only a few are used in combination. Using different
templates for each major combination is a more compact alternative to having one template with many optional members.
The current template is a reference to the template being processed. It is updated when a template
identifier is encountered in the stream. A static template reference can also change the current template as
described in the Template Reference Instruction section.
The dictionary set and initial value are described in the Operators section below.
integerField =
element int32 { fieldInstrContent }
| element uInt32 { fieldInstrContent }
| element int64 { fieldInstrContent }
| element uInt64 { fieldInstrContent }
It is a dynamic error [ERR D2] if an integer in the stream is greater than the maximum value or less than
the minimum value for the specified type. The following table lists the minimum and maximum values
that can be represented by each integer type:
2 if and only if
The base value depends on the state of the previous value in the following way:
• assigned – the base value is the previous value.
• undefined – the base value is the initial value if present in the instruction context. Otherwise a
type dependant default base value is used.
• empty – it is a dynamic error [ERR D6] if the previous value is empty.
The following sections define the delta value representations, the default base values and how values are
combined depending on type.
NOTE: The size of the integer required for the delta may be larger than the specified size for the field
type. For example, if a field of type uInt32 has the base 4294967295 and the new value is 17 an int64 is
required to represent the delta -4294967278. However, this does not affect how the delta appears in
the stream.
NOTE: Since the delta operator for decimals comprises individual deltas for the exponent and
mantissa, an implementation must store the previous value of a decimal in such a way that the layout in
exponent and mantissa parts is preserved or can be recreated when processing the next field.
The following sections define the tail value representations, the default base values and how values are
combined depending on type. The tail operator is only applicable to these types.
7 Names
A name in a template definition consists of two parts, a namespace URI and a local name.
NOTE: The fact that this specification provides a way to specify auxiliary identifiers in-band does not
imply that there cannot be other in-band (through foreign elements or attributes, see the Extensibility
section) or out-of-band schemes for mapping auxiliary identifiers to names of components. The id
attribute is provided for convenience.
8 Type Conversion
When the type of a field in a template differs from the type of the corresponding field in the current
application type, values must be converted when the field is encoded and decoded. This section defines
the conversion between pairs of different types.
Byte vectors can only be converted to and from strings. All other conversion with byte vectors are
dynamic errors [ERR D10].
9 Extensibility
Application specific data can be added to a template definition in the XML format by using foreign
attributes and elements. Any element in the schema may have foreign attributes and foreign child
elements. A foreign attribute is an attribute with a name whose namespace URI is neither the empty string
nor the TD namespace URI. A foreign element is an element with a name whose namespace URI is not
the TD namespace URI. Foreign child elements may be placed freely with respect to other child elements.
There are no restrictions on the content of foreign attributes and elements.
The extensibility parts are implemented in the schema using the other pattern which is placed at the
relevant places in the schema using the interleave operator.
10 Transfer Encoding
The following EBNF grammar specifies the overall structure of a FAST stream. Terminal symbols are in
italics. The start symbol is stream.
stream ::= message* | block*
block ::= BlockSize message+
message ::= segment
segment ::= PresenceMap TemplateIdentifier? (field | segment)*
field ::= integer | string | delta | ScaledNumber | ByteVector
integer ::= UnsignedInteger | SignedInteger
string ::= ASCIIString | UnicodeString
delta ::= IntegerDelta | ScaledNumberDelta | ASCIIStringDelta |
ByteVectorDelta
A FAST stream consists of a sequence of messages or a sequence of blocks. This specification does not
provide a way of saying which style is used for a particular stream. Thus this must be agreed upon
between the producer and consumer of the encoded data.
A block is a sequence of one or more messages. A block has a leading block size specifying the number of
bytes occupied by the messages of the block. It is a dynamic error [ERR D12] if a block has zero size. The
10.4 Nullability
Each field has a type that has a nullability property. If a type is nullable, there is a special representation of a
NULL value. When a type is non-nullable, no representation for NULL is reserved. All nullable types are
constructed in such a way that NULL is represented as a 7-bit entity value where all bits are zero. It is
represented as 0x80 when stop bit encoded.
Unless explicitly specified, non-nullable representations are used.
NOTE: The type of a length field of a sequence is uInt32, as specified by section 6.2.5. This means that
any encoding rule that is applicable to an unsigned integer field is also applicable to the length field of a
sequence.
A field will not occupy any bit in the presence map if it is mandatory and has the constant operator.
An optional field with the constant operator will occupy a single bit. If the bit is set, the value is the initial
value in the instruction context. If the bit is not set, the value is considered absent.
If a field is mandatory and has no field operator, it will not occupy any bit in the presence map and its
value must always appear in the stream.
If a group field is optional, it will occupy a single bit in the presence map. The contents of the group may
appear in the stream iff the bit is set. The instructions in the group are not processed if the bit is not set.
This means that the previous values of fields in the group are not affected by an absent group. If the
application representation of a message has no notion of groups, each field of an absent group is
considered absent.
If a field is optional and has no field operator, it is encoded with a nullable representation and the NULL
is used to represent absence of a value. It will not occupy any bits in the presence map.
The default, copy, and increment operators have the following presence map and NULL utilization:
• Mandatory integer, decimal, string and byte vector fields – one bit. If set, the value appears in the
stream.
• Optional integer, decimal, string and byte vector fields – one bit. If set, the value appears in the
stream in a nullable representation. A NULL indicates that the value is absent and the state of the
previous value is set to empty, except when the default operator is used in which case the state of
the previous value is left unchanged.
The delta operator has the following presence map utilization:
• Mandatory integer, decimal, string and byte vector fields – no bit.
• Optional integer, decimal, string and byte vector fields – no bit. The delta appears in the stream in
a nullable representation. A NULL indicates that the delta is absent. Note that the previous value
is not set to empty but is left untouched if the value is absent.
The tail operator has the following presence map utilization:
• Mandatory string and byte vector fields – one bit.
• Optional string and byte vector fields – one bit. The tail value appears in the stream in a nullable
representation. A NULL indicates that the value is absent and the state of the previous value is set
to empty.
Decimal fields with individual operators have the following utilization:
• If the decimal has mandatory presence, the exponent and mantissa fields are treated as two
separate mandatory integer fields as described above.
• If the decimal has optional presence, the exponent field is treated as an optional integer field and
the mantissa field is treated as a mandatory integer field. The presence of the mantissa field and
10.6 Fields
NOTE: The encoding of a nullable integer may require more bits than the maximum number of bits
specified in the integer type. For example, the nullable representation of the maximum 32 bit unsigned
integer 4294967295 is 4294967296, which would be encoded as 0x10 0x00 0x00 0x00 0x80, and
requires 33 significant bits in the entity value.
NOTE: Since the most significant bit of the entity value is the sign bit, there are some situations where
the seven most significant bits of the entity value must all be zeroes. For example, if the value to
encode is 64, which has the binary representation 01000000, the stop bit encoding must be 0x00 0xC0.
If we did not have the extra seven leading zero bits, the most significant bit, which is also the sign bit,
would be one, and thus the encoding would incorrectly represent -64.
10.7 Delta
template = element template { ( templateNsName, nsAttr?, dictionaryAttr?, typeRef?, instruction* ) & other }
integerField =
element int32 { fieldInstrContent }
| element uInt32 { fieldInstrContent }
| element int64 { fieldInstrContent }
| element uInt64 { fieldInstrContent }
decFieldOp = element exponent { fieldOp & other }?, element mantissa { fieldOp & other }?
sequence = element sequence { ( nsName, presenceAttr?, dictionaryAttr?, typeRef?, length?, instruction* ) & other }
group = element group { ( nsName, presenceAttr?, dictionaryAttr?, typeRef?, instruction* ) & other }
<xs:element name="templates">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="td:template"/>
<xs:group ref="td:other"/>
</xs:choice>
<xs:attribute name="ns"/>
<xs:attribute name="templateNs"/>
<xs:attribute name="dictionary">
<xs:simpleType>
<xs:union memberTypes="xs:string">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="template"/>
<xs:enumeration value="type"/>
<xs:enumeration value="global"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:attribute>
<xs:attributeGroup ref="td:other"/>
</xs:complexType>
</xs:element>
<xs:element name="template">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:choice>
<xs:element ref="td:typeRef"/>
<xs:group ref="td:instruction"/>
</xs:choice>
<xs:group ref="td:other"/>
</xs:choice>
<xs:attributeGroup ref="td:templateNsName"/>
<xs:attribute name="ns"/>
<xs:attribute name="dictionary">
<xs:simpleType>
<xs:union memberTypes="xs:string">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="template"/>
<xs:enumeration value="type"/>
<xs:enumeration value="global"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:attribute>
<xs:attributeGroup ref="td:other"/>
</xs:complexType>
</xs:element>
<xs:element name="typeRef">
<xs:complexType>
<xs:group ref="td:other"/>
<xs:attributeGroup ref="td:nameAttr"/>
<xs:attribute name="ns"/>
<xs:attributeGroup ref="td:other"/>
</xs:complexType>
</xs:element>
<xs:group name="instruction">
<xs:choice>
<xs:group ref="td:field"/>
<xs:element ref="td:templateRef"/>
</xs:choice>
</xs:group>
<xs:group name="fieldInstrContent">
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="td:fieldOp"/>
<xs:group ref="td:other"/>
</xs:choice>
</xs:sequence>
</xs:group>
<xs:attributeGroup name="fieldInstrContent">
<xs:attributeGroup ref="td:nsName"/>
<xs:attribute name="presence">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:group name="field">
<xs:choice>
<xs:group ref="td:integerField"/>
<xs:element ref="td:decimal"/>
<xs:group ref="td:stringField"/>
<xs:element ref="td:byteVector"/>
<xs:element ref="td:sequence"/>
<xs:element ref="td:group"/>
</xs:choice>
</xs:group>
<xs:complexType name="integerField">
<xs:group ref="td:fieldInstrContent"/>
<xs:attributeGroup ref="td:fieldInstrContent"/>
</xs:complexType>
<xs:group name="integerField">
<xs:choice>
<xs:element ref="td:int32"/>
<xs:element ref="td:uInt32"/>
<xs:element ref="td:int64"/>
<xs:element ref="td:uInt64"/>
</xs:choice>
</xs:group>
<xs:element name="decimal">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:choice>
<xs:group ref="td:fieldOp"/>
<xs:choice>
<xs:element ref="td:exponent"/>
<xs:element ref="td:mantissa"/>
</xs:choice>
</xs:choice>
<xs:group ref="td:other"/>
</xs:choice>
<xs:attributeGroup ref="td:nsName"/>
<xs:attribute name="presence">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="mandatory"/>
<xs:enumeration value="optional"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attributeGroup ref="td:other"/>
</xs:complexType>
</xs:element>
<xs:element name="exponent">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="td:fieldOp"/>
<xs:group ref="td:other"/>
</xs:choice>
<xs:attributeGroup ref="td:other"/>
</xs:complexType>
</xs:element>
<xs:element name="mantissa">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="td:fieldOp"/>
<xs:group ref="td:other"/>
</xs:choice>
<xs:attributeGroup ref="td:other"/>
</xs:complexType>
</xs:element>
<xs:group name="stringField">
<xs:sequence>
<xs:element name="string">
<xs:complexType>
<xs:sequence>
<xs:group minOccurs="0" ref="td:byteVectorLength"/>
<xs:group ref="td:fieldInstrContent"/>
</xs:sequence>
<xs:attributeGroup ref="td:fieldInstrContent"/>
<xs:attribute name="charset">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="ascii"/>
<xs:element name="byteVector">
<xs:complexType>
<xs:sequence>
<xs:group minOccurs="0" ref="td:byteVectorLength"/>
<xs:group ref="td:fieldInstrContent"/>
</xs:sequence>
<xs:attributeGroup ref="td:fieldInstrContent"/>
</xs:complexType>
</xs:element>
<xs:group name="byteVectorLength">
<xs:sequence>
<xs:element name="length">
<xs:complexType> <xs:attributeGroup ref="td:nsName"/> </xs:complexType>
</xs:element>
</xs:sequence>
</xs:group>
<xs:element name="sequence">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:choice>
<xs:element ref="td:typeRef"/>
<xs:group ref="td:length"/>
<xs:group ref="td:instruction"/>
</xs:choice>
<xs:group ref="td:other"/>
</xs:choice>
<xs:attributeGroup ref="td:nsName"/>
<xs:attribute name="presence">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="mandatory"/>
<xs:enumeration value="optional"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="dictionary">
<xs:simpleType>
<xs:union memberTypes="xs:string">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="template"/>
<xs:enumeration value="type"/>
<xs:enumeration value="global"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:attribute>
<xs:attributeGroup ref="td:other"/>
</xs:complexType>
</xs:element>
<xs:group name="length">
<xs:sequence>
<xs:element name="length">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="td:fieldOp"/>
<xs:group ref="td:other"/>
</xs:choice>
<xs:attribute name="name" type="xs:token"/>
<xs:attribute name="ns"/>
<xs:attribute name="id" type="xs:token"/>
<xs:attributeGroup ref="td:other"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:group>
<xs:element name="group">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:choice>
<xs:element ref="td:typeRef"/>
<xs:group ref="td:instruction"/>
</xs:choice>
<xs:group ref="td:other"/>
</xs:choice>
<xs:attributeGroup ref="td:nsName"/>
<xs:attribute name="presence">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="mandatory"/>
<xs:enumeration value="optional"/>
</xs:restriction>
<xs:group name="fieldOp">
<xs:choice>
<xs:element ref="td:constant"/>
<xs:element ref="td:default"/>
<xs:element ref="td:copy"/>
<xs:element ref="td:increment"/>
<xs:element ref="td:delta"/>
<xs:element ref="td:tail"/>
</xs:choice>
</xs:group>
<xs:element name="constant">
<xs:complexType>
<xs:group ref="td:other"/>
<xs:attributeGroup ref="td:initialValueAttr"/>
<xs:attributeGroup ref="td:other"/>
</xs:complexType>
</xs:element>
<xs:element name="default">
<xs:complexType>
<xs:group ref="td:other"/>
<xs:attribute name="value"/>
<xs:attributeGroup ref="td:other"/>
</xs:complexType>
</xs:element>
<xs:complexType name="opContext">
<xs:group ref="td:other"/>
<xs:attribute name="dictionary">
<xs:simpleType>
<xs:union memberTypes="xs:string">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="template"/>
<xs:enumeration value="type"/>
<xs:enumeration value="global"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="key" type="xs:token"/>
<xs:attribute name="ns"/>
<xs:attribute name="value"/>
<xs:attributeGroup ref="td:other"/>
</xs:complexType>
<xs:element name="templateRef">
<xs:complexType>
<xs:group ref="td:other"/>
<xs:attribute name="name" type="xs:token"/>
<xs:attribute name="templateNs"/>
<xs:attributeGroup ref="td:other"/>
</xs:complexType>
</xs:element>
<xs:attributeGroup name="nsName">
<xs:attributeGroup ref="td:nameAttr"/>
<xs:attribute name="ns"/>
<xs:attribute name="id" type="xs:token"/>
</xs:attributeGroup>
<xs:attributeGroup name="templateNsName">
<xs:attributeGroup ref="td:nameAttr"/>
<xs:attribute name="templateNs"/>
<xs:attribute name="id" type="xs:token"/>
</xs:attributeGroup>
<xs:group name="foreignElm">
<xs:choice>
<xs:any namespace="##other" processContents="skip"/>
<xs:any namespace="##local" processContents="skip"/>
</xs:choice>
</xs:group>
2 1 None 0 None
4 2 4 1 0x84
10000100
5 4 None
The initial prior value in example 1 above is 0 (zero). The default value can be specified in the template.
3. Multiple Pmap Slot Example – Optional Positive Decimal with individual field operators
* An optional field with the constant operator will occupy a single bit. The bit will be set on if the input
value is equal to the initial value specified in the instruction context. The bit will be set off if the input
value is absent.
Dynamic Errors
ERR D1
It is a dynamic error if type of a field in a template cannot be converted to or from the type of the
corresponding application field.
ERR D2
It is a dynamic error if an integer in the stream does not fall within the bounds of the specific
integer type specified on the corresponding field.
ERR D3
It is a dynamic error if a decimal value cannot be encoded due to limitations introduced by using
individual operators on exponent and mantissa.
ERR D4
It is a dynamic error if the type of the previous value is not the same as the type of the field of the
current operator.
ERR D5
It is a dynamic error if a mandatory field is not present in the stream, has an undefined previous
value and there is no initial value in the instruction context.
ERR D6
It is a dynamic error if a mandatory field is not present in the stream and has an empty previous
value.
ERR D7
It is a dynamic error if the subtraction length exceeds the length of the base value or if it does not
fall in the value rang of an int32.
ERR D8
It is a dynamic error if the name specified on a static template reference does not point to a
template known by the encoder or decoder.
Dynamic Errors
ERR R1
It is a reportable error if a decimal cannot be represented by an exponent in the range [-63 … 63]
or if the mantissa does not fit in an int64.
ERR R2
It is a reportable error if the combined value after applying a tail or delta operator to a Unicode
string is not a valid UTF-8 sequence.
ERR R3
It is a reportable error if a Unicode string that is being converted to an ASCII string contains
characters that are outside the ASCII character set.
ERR R4
It is a reportable error if a value of an integer type cannot be represented in the target integer type
in a conversion.
ERR R5
It is a reportable error if a decimal being converted to an integer has a negative exponent or if the
resulting integer does not fit the target integer type.
ERR R6
It is a reportable error if an integer appears in an overlong encoding.
ERR R7
It is a reportable error if a presence map is overlong.
ERR R8
It is a reportable error if a presence map contains more bits than required.
ERR R9
It is a reportable error if a string appears in an overlong encoding.