Приветствую! Разбираюсь с FAST, нужна помощь. Похоже, эта тема похожа http://forum.moex.com/viewtopic.asp?p=185094#185094, но у меня всё равно куча вопросов. Постараюсь писать подробно, мб кому-нибудь это поможет. Например, возьмём такое сообщение от тестового сервера, Instrument Replay:
Просто конвертнув его в строку ASCII понимаю, что это GAZR-6.17, так что можно двигаться дальше. Преамбула в этом случае 33 00 00 00. Насколько я понимаю, её по байтам нужно инвертировать, получится 33 (hex), что значит 51 (10). Почему её нужно инвертировать, ведь в FAST sm Specification Version 1.x.1 (http://ftp.moex.com/pub/FAST/ASTS/docs/FAST%20Specification1_1.pdf) написано (хотя преамбула в спецификацию не входит):
Цитата:
10.1 Byte and Bit Ordering (досл.) Все целочисленные поля представлены по порядку от старшего ко младшему, согласно которому биты и байты расположены в том порядке, в котором они передаются по сети: биты старшего порядка предшествуют (видимо, приходят раньше) битам младшего порядка, байты старшего порядка предшествуют байтам младшего порядка.
Далее PMAP C0 (hex) = 1100 0000 (2). Старший бит - 1, значит, PMAP длинной в 1 байт. Для меня пока загадка, что означает 1 во втором по величине разряде, вернусь к нему позже. Вообще, насколько я понимаю из той же спецификации, в темплейте опреден порядок полей, а PMAP показывает, какие из этих полей пришли в сообщении и какие нужно взять оставить как есть/по-дефолту.
Далее идёт templateId в 2 байта - 91 B3 (hex) = 37299 (10). С этими знаниями иду на ftp MOEX за шаблоном: ftp://ftp.moex.com/pub/FAST/Spectra/test/templatesT0/internet_test/templates.xml Подходящего темплейта не нахожу. В чём дело? Не умею переводить числа между системами счисления? Не тот XML использую? Чувствую, мне нужен <template name="SecurityDefinition" id="16">, но как понять это из сообщения?
Далее двигаться нет смысла (пока), но я попробую. Начиная с 8 бита сообщения (23 (hex)) начинается смысловая часть, которую нужно сопоставлять с шаблоном. Я распарсил несколько полей, насколько я понимаю, выглядеть они будут так:
Поле 1:23 6E 59 67 10 2C 19 9C
Поле 2: B5
Поле 3: 47 5A 48 B9
Поле 4: B0
Поле 5: D0
Я правильно использую стоп-бит? Само собой, при парсинге в значения его нужно будет исключить, но пока нет темплейта, не понимаю, во что парсить.
Я так понял это FAST FORTS. С ним не работал. Но могу предположить, что TemplateId это 0x91 = 1001 0001, убираем стоп бит, получаем 001 0001, переводим в uint32 получаем 17, если это nullable field, то нужно еще вычесть 1, получим templateId=16, если нет, то templateId=17.
Последний раз редактировалось автором 21.01.2019 12:28, всего редактировалось 1 раз
Спасибо за ответ! Это FORTS. Похоже, но тогда появляются ещё вопросы. Почему же templateId в 1 байт? С спеке fast пункт 3.2 приведена структура сообщения
Получается 2 байта. Также не вижу смысла кодировать поле с предопределённым размером стоп-битами (зачем, ведь его размер известен), и а поле templateId делать nullable (разве бываю сообщения fast без шаблона?) Может быть, в спеке имеется вииду то, что templateId занимает до двух бит, при этом кодируется стоп-байтами? Стоп-байтом я называю байт, первый бит которого - стоп бит. Как знать?
Похоже, но тогда появляются ещё вопросы. Почему же templateId в 1 байт? С спеке fast пункт 3.2 приведена структура сообщения
Можете написать на биржу в тех.поддержку и уточнить, но я бы пока жду ответ ориентировался на то, что TemplateId тоже кодируется стоп-битом, а не имеет фиксированную длину.
Цитата:
Может быть, в спеке имеется вииду то, что templateId занимает до двух бит, при этом кодируется стоп-байтами?
У вас какая-то путаница с байтами, битами и стоп битами. В байте 8 бит. Поля , которые кодируются стоп-битом несут информацию о значении только в 7 битах. Первый бит используется , чтобы сообщить где последний байт, его(первый бит) в расчёт не берём.