Как декодировать последовательности в протоколе FAST

У меня есть некоторые проблемы с последовательностями в сообщении FAST
Например, у меня есть следующий шаблон XML

 <template name="DefaultIncrementalRefreshMessage" id="1">
    <string name="ApplVerID" id="1128">
        <constant value="9"/>
    </string>
    <string name="MessageType" id="35">
        <constant value="X"/>
    </string>
    <string name="SenderCompID" id="49">
        <constant value="MOEX"/>
    </string>
    <uInt32 name="MsgSeqNum" id="34"/>
    <uInt64 name="SendingTime" id="52"/>
    <uInt32 name="LastFragment" id="893" presence="optional"/>
    <sequence name="MDEntries">
        <length name="NoMDEntries" id="268"/>
        <uInt32 name="MDUpdateAction" id="279"/>
        <string name="MDEntryType" id="269"/>
        <uInt64 name="SecurityID" id="48" presence="optional"/>
        <uInt32 name="SecurityIDSource" id="22">
            <constant value="8"/>
        </uInt32>
        <string name="Symbol" id="55" presence="optional"/>
        <string name="SecurityGroup" id="1151" presence="optional"/>
        <uInt32 name="ExchangeTradingSessionID" id="5842" presence="optional"/>
        <uInt32 name="RptSeq" id="83"/>
        <uInt32 name="MarketDepth" id="264" presence="optional"/>
        <uInt32 name="MDPriceLevel" id="1023" presence="optional"/>
        <int64 name="MDEntryID" id="278" presence="optional"/>
        <decimal name="MDEntryPx" id="270" presence="optional"/>
        <int64 name="MDEntrySize" id="271" presence="optional"/>
        <uInt32 name="MDEntryDate" id="272" presence="optional"/>
        <uInt32 name="MDEntryTime" id="273"/>
        <int32 name="NumberOfOrders" id="346" presence="optional"/>
        <string name="MDEntryTradeType" id="20003" presence="optional"/>
        <int32 name="TrdType" id="828" presence="optional"/>
        <decimal name="LastPx" id="31" presence="optional"/>
        <int32 name="MDFlags" id="20017" presence="optional"/>
        <string name="Currency" id="15" presence="optional"/>
        <uInt64 name="Revision" id="20018" presence="optional"/>
        <string name="OrderSide" id="10504" presence="optional"/>
    </sequence>
</template>

Сначала я получаю PMap нашего шаблона, следующим шагом я получаю идентификатор шаблона, после чего я читаю байты один за другим, и все работает нормально, но если я получу последовательность 'MDEntries', мои данные будут неправильными, потому что последовательность байтов будет нарушена.

Я увидел следующее изображение со структурой FAST Message и подумал, что мне следует прочитать PMap последовательности и длины 'NoMDEntries', а затем прочитать байты один за другим, правильно? Раньше я думал, что я просто должен читать байты один за другим и удалять стоп-биты БЫСТРАЯ Структура сообщения

Помогите мне, как правильно разобрать "последовательность"

1 ответ

Согласно спецификации протокола FAST, если в последовательности нет полей, требующих наличия бита PMap (как в вашем случае), то PMap не должен присутствовать в потоке. Чтобы понять, требуется ли для поля наличие бита PMap, вы можете использовать следующую таблицу:

                   | PMap Bit is required
-----------------------------------
Operator     | Mandatory | Optional
-----------------------------------
None         | no        | no
<constant/>  | no        | yes
<copy/>      | yes       | yes
<default/>   | yes       | yes
<delta/>     | no        | no
<increment/> | yes       | yes
<tail/>      | yes       | yes

Вы можете обратиться к параграфу 10.5 и Приложению 3.3.1 в этом документе: http://ftp.moex.com/pub/FAST/ASTS/docs/FAST%20Specification1_1.pdf

Другие вопросы по тегам