Блог им. IvanKorotchenya

дешифровка FAST сообщений

Всем добрый день!

Пытаюсь расшифровать Fast сообщение от московской биржи, никак не могу понять как использовать pmap.

Например я получаю от сервера сообщение 
\xe1.\x01\x00\xc0\x10\xbc\x04]\xe1\x03,$\x07\x0be[\x0e\xc3

Первые 4 байта согласно спецификации — преамбула, отбросив ее:
\xc0\x10\xbc\x04]\xe1\x03,$\x07\x0be[\x0e\xc3

Затем получаю первый байт:
\xc0 = 1100 0000
Но шаблон сообщения-сердцебиения вообще не содержит опциональных полей. 

<template name=«0» id=«2108» xmlns="http://www.fixprotocol.org/ns/fast/td/1.1"><string name=«MessageType» id=«35»><constant value=«0» /></string><string name=«BeginString» id=«8»><constant value=«FIXT.1.1»/></string><string name=«SenderCompID» id=«49»><constant value=«MOEX»/></string><uInt32 name=«MsgSeqNum» id=«34»></uInt32><uInt64 name=«SendingTime» id=«52»></uInt64></template>

Столкнулся с этим почти во всех сообщения, во многих 5 байт равен \xC0 хотя в некоторых случаях это не может соответсвовать pmap для этого шаблона. 

Кто-нибудь сталкивался с такой проблемой при дешифроке? Не могу понять где я ошибаюсь
16 комментариев
Спросите у chat gpt 4o.
avatar
Auximen, Пробовал, к сожелению ничего адекватного он не смог подсказать насчет этого вопроса
Иван Коротченя, так а зачем вы лезете на уровень байтов? Наверняка сообщения приходят в JSON формате, приведите пример FAST-сообщения. И чем расшифровываете? Pmap есть во многих языках. Python?
avatar
Auximen, сообщения не приходят в json формате, fast это ускоренные fix сообщения. Пример приводил в сообщение, вот \xe1.\x01\x00\xc0\x10\xbc\x04]\xe1\x03,$\x07\x0be[\x0e\xc3
Сообщения fast невозможно расшифровать не лезя на уровень битов. (там используется стоп бит как разделитель). Не очень понимаю что Вы имеете ввиду под pmap есть во многих языках, я имею ввиду pmap как часть протокола fast. Не столь важно на чем, это пример сообщений из python, но если есть примены на js/c++/go я буду очень признателен
Иван Коротченя, может поможет моя статья habr.com/ru/articles/827330/ Но реокомендую вам взять готовые парсеры, если у вас уже на старте такая простая проблема.
avatar
Gambler , Я читал вашу статью, да еще вот эта очень помогла jettekfix.com/education/fix-fast-tutorial/. Если я подставляю другой pmap все начинает работать (не из сообщения, а в ручную подобранный). То есть если я считываю pmap от биржи \xc0 забываю про него и начинаю парсить сообщение с другим (таким чтоб Symbol попадал на место где символ) все идеально работает. Но, к сожелению, такая модель расшифровки работает только для сообщений типа Snapshoot (где Символ содержится не внутри sequence), еще очень долгая и главное я хочу понять что я делаю не так). И самое забавно во всем этом, что такого байта чтоб все поля попадали как нужно в принципе нет в первых 5 байтах приходящих мне. (я уже думаю на тестовый контур, но тех саппорт биржи заверил меня что там все как на настоящем)
Иван Коротченя, ошибка, конечно, где-то у вас. За вас в вашем коде её никто не найдет ) У МосБиржи оптимизация, они транспортный хидер не по стандарту дают для оптимизации, но карта присутствия емнип работает по стандарту.

Ищите у себя. Или как правильно сказали — что-то скачайте готовое. Вы на C++ пишите? mfast как вариант.
avatar
биржа пытается намекнуть вам, что не надо торговать на ней
Хомяк Пржевальского, Вот так люди и уходят в крипту...)
Есть готовые решения в open source, почему там не посмотреть?
avatar
John Doe, Мне попадаются очень странные варианты, вы имеете ввиду какое-то конкретное?
Кто-нибудь сталкивался с такой проблемой при дешифроке? Не могу понять где я ошибаюсь

Был когда-то такой старый анекдот, про то как молодой программист приходит к опытному товарищу, показывает код и просит подсказать где у него ошибка и получает ответ что в ДНК у него ошибка )

Ты что-нибудь слышал про big-endian и little-endian порядок байт? Раз уж в битиках копаться собрался то поинтересуйся, это полезное знание!
Пафос Респектыч, В памяти есть что-то такое со времен знакомства с ассемблером) Сейчас освежил, но проблема появляется с битами внутри pmap и тут порядок чтения байт мне не поможет(
Но все равно спасибо)
И ещё посмотри в спеку, там вроде написано что сразу после преамбулы идёт число номер сообщения, чтобы его можно было сразу проверить не парся всё остальное, наверное вот это вот он и есть который тебя озадачивает.
Пафос Респектыч, Не очень понял, преамбула ведь и есть номер сообщения (то есть во всяком случае они пишут что добавляют ее для как раз этой проверки)
Иван Коротченя, ну покажи какую ты спеку читаешь?

теги блога Иван Коротченя

....все тэги



UPDONW
Новый дизайн