ПоискПоиск  ПравилаПравила  ПользователиПользователи  ПрофильПрофиль  РегистрацияРегистрация  ВходВход
Форум «Техническая поддержка»
Форум для разработчиков и пользователей программного обеспечения, использующегося на бирже.

Раздел тех.поддержки | Форма обратной связи Тех.поддержка ОАО Московская Биржа: +7 (495) 733-9507, 287-7691
FAST для нового чайника.
Новая тема   Ответить на тему
 Предыдущая тема :: Следующая тема 
 Автор  Сообщение 
pavvvkin
Стаж: 2 месяца 28 дней
Сообщений: 4
Сб Янв 19, 2019 23:16 Ответить с цитатой Получить постоянный адрес сообщения
Приветствую!
Разбираюсь с FAST, нужна помощь. Похоже, эта тема похожа http://forum.moex.com/viewtopic.asp?p=185094#185094, но у меня всё равно куча вопросов. Постараюсь писать подробно, мб кому-нибудь это поможет.
Например, возьмём такое сообщение от тестового сервера, Instrument Replay:
33 00 00 00 C0 91 B3 23
6E 59 67 10 2C 19 9C B5
47 5A 48 B9 B0 D0 A4 D1
8C D1 8E D1 87 D0 B5 D1
80 D1 81 D0 BD D1 8B D0
B9 20 D0 BA D0 BE D0 BD
D1 82 D1 80 D0 B0 D0 BA
D1 82 20 47 41 5A 52 2D
33 2E 31 39 22 25 8A 47
41 5A 52 2D 33 2E 31 B9
B8 80 46 58 58 58 58 D8
80 83 81 83 52 55 C2 C6
84 4C 9B 80 83 49 51 53
2D 46 55 54 2D 54 52 41
44 45 D3 80 80 49 51 53
2D 46 55 54 2D 42 4F 4F
4B 2D B1 82 82 49 51 53
2D 46 55 54 2D 42 4F 4F
4B 2D 35 B0 B3 83 82 47
41 5A D2 80 80 FB 06 4C
12 44 E0 FB 05 28 4B 3D
A0 FB 06 0D A0 FB 06 0D
A0 FE 14 54 88 FE 15 1C
C2 80 80 80 80 80 80 80
80 83 87 09 50 28 F1 23
6E 5F 54 00 12 71 80 85
09 4F 61 E2 23 6C 56 5C
57 3F 45 80 09 50 28 F2
64 11 31 81 00 F4

Просто конвертнув его в строку 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

Я правильно использую стоп-бит? Само собой, при парсинге в значения его нужно будет исключить, но пока нет темплейта, не понимаю, во что парсить.
 
 
qnt
Стаж: 7 лет
Сообщений: 5
Пн Янв 21, 2019 12:28 (спустя 1 день 13 часов) Ответить с цитатой Получить постоянный адрес сообщения
Я так понял это FAST FORTS. С ним не работал. Но могу предположить, что TemplateId это 0x91 = 1001 0001, убираем стоп бит, получаем 001 0001, переводим в uint32 получаем 17, если это nullable field, то нужно еще вычесть 1, получим templateId=16, если нет, то templateId=17. 
 
Последний раз редактировалось автором 21.01.2019 12:28, всего редактировалось 1 раз
pavvvkin
Стаж: 2 месяца 28 дней
Сообщений: 4
Пн Янв 21, 2019 15:34 (спустя 1 день 16 часов) Ответить с цитатой Получить постоянный адрес сообщения
Спасибо за ответ! Это FORTS.
Похоже, но тогда появляются ещё вопросы. Почему же templateId в 1 байт? С спеке fast пункт 3.2 приведена структура сообщения

Получается 2 байта. Также не вижу смысла кодировать поле с предопределённым размером стоп-битами (зачем, ведь его размер известен), и а поле templateId делать nullable (разве бываю сообщения fast без шаблона?)
Может быть, в спеке имеется вииду то, что templateId занимает до двух бит, при этом кодируется стоп-байтами? Стоп-байтом я называю байт, первый бит которого - стоп бит. Как знать? 
 
qnt
Стаж: 7 лет
Сообщений: 5
Пн Янв 21, 2019 16:22 (спустя 1 день 17 часов) Ответить с цитатой Получить постоянный адрес сообщения
Цитата:
Похоже, но тогда появляются ещё вопросы. Почему же templateId в 1 байт? С спеке fast пункт 3.2 приведена структура сообщения 

Можете написать на биржу в тех.поддержку и уточнить, но я бы пока жду ответ ориентировался на то, что TemplateId тоже кодируется стоп-битом, а не имеет фиксированную длину.

Цитата:
Может быть, в спеке имеется вииду то, что templateId занимает до двух бит, при этом кодируется стоп-байтами? 
У вас какая-то путаница с байтами, битами и стоп битами. В байте 8 бит. Поля , которые кодируются стоп-битом несут информацию о значении только в 7 битах. Первый бит используется , чтобы сообщить где последний байт, его(первый бит) в расчёт не берём.

Пример: декодируем поле uint32 not nullable, когда пришло 0x04 0xFF
hex encoded : 0x04 0xFF
binary : 0000 0100 1111 1111
delete stop-bit : _000 0100 _111 1111
склеиваем : 10 0111 1111
--------------------------------------------
hex склейки : 0x02 0x7F
decode value : 639



 
 
Последний раз редактировалось автором 21.01.2019 16:56, всего редактировалось 2 раза
pavvvkin
Стаж: 2 месяца 28 дней
Сообщений: 4
Пн Янв 21, 2019 16:50 (спустя 1 день 17 часов) Ответить с цитатой Получить постоянный адрес сообщения
Цитата:
... Первый бит используется , чтобы сообщить где последний байт, его(последний бит) в расчёт не берём. 

Первый же не учитываем. Благодарю за пример! В примере то как раз первый не учитываем. Пишу бирже в поддержку. 
 
qnt
Стаж: 7 лет
Сообщений: 5
Пн Янв 21, 2019 16:57 (спустя 1 день 17 часов) Ответить с цитатой Получить постоянный адрес сообщения
Цитата:
Первый же не учитываем 

Да, верно, поправил. 
 
Показать сообщения:   
Новая тема   Ответить на тему
Список разделов форума -> Техническая поддержка

Rambler's Top100 Rambler's Top100
Рейтинг@Mail.ru
Copyright © Московская биржа, 2006-2019.
Ваши предложения, замечания и вопросы
по работе форума направляйте на email: