Ada_Ru форум

Обсуждение языка Ада

[ada_ru] Упаковка не кратных байту

Оставить новое сообщение

Сообщения

Vladimir Troshin
[ada_ru] Упаковка не кратных байту
2019-12-10 21:11:39

 

               Здравствуйте коллеги! 

 

     Вынужден обратиться за помощью и разъяснить: как можно упаковать информацию нерегулярными порциями бит в одну длиннющую последовательность, ну, или короткую для начала. Дело касается ASN.1 который B2, кто в курсе. Смысл: географические данные — Широта (0..90) укладывается в размер 128 — то есть 7 бит, на следующую Долготу (0..180) это уже 256 потребуется 8 бит, далее Высота (метры или футы — различные пределы) и т.д. Да и ещё: во время следующей передачи данных высота может не задаваться — её достаточно передавать раз через пять на шестой. Переменных много и они могут то выпадать, то проявляться в этой общей череде.

     Укладывать спецификатором надо бы, но уж очень много параметров, длины неодинаковые. Предложил использовать модальные типы, сдвигать побитово умножением, складывать "or", зачищать масками через "and" и пр. Задающий задание такого решения не хочет, записывать в файл тоже не хочет (понятно почему), а предполагает всё же использовать спецификаторы и записывать по адресу в память… но не знает как. 

     Короче, перейти в другое отделение теперь мне не светит (не справился с заданием) — да и ладно для моего преклонного возраста, но ведь они молодые и сами не знают, а это уже заело, хочу понять решение. Просьба разъяснить или натолкнуть на мысль.

     

     P.S. Наткнулся случайно по ссылке с Ada User Journal /увидел знакомые фамилии Казаков и Дульман/ на гитхаб, что-ли, где разработка по теме ASN.1, но не могу понять, сложновато. Вероятно, существует более простое решение.

 

С уважением, Владимир.

 

--

Vladimir S. Troshin

 

[Non-text portions of this message have been removed]

 

 

On 2019-12-10 22:11, Vladimir Troshin adaos@mail.ru [ada_ru] wrote:

 

     Вынужден обратиться за помощью и разъяснить: как можно упаковать информацию нерегулярными порциями бит в одну длиннющую последовательность, ну, или короткую для начала. Дело касается ASN.1 который B2, кто в курсе.

 

ASN.1 как раз не пакует битовые последовательности. В ASN.1 они

выравниваются на границу октета. Неиспользованные биты маскируются. Если интересно см. Simple Components пакет

GNAT.Sockets.Connection_State_Machine.ASN1.Bit_Strings

 

Смысл: географические данные — Широта (0..90) укладывается в размер 128 — то есть 7 бит, на следующую Долготу (0..180) это уже 256

потребуется 8 бит, далее Высота (метры или футы — различные пределы) и т.д. Да и ещё: во время следующей передачи данных высота может не задаваться — её достаточно передавать раз через пять на шестой.

Переменных много и они могут то выпадать, то проявляться в этой общей череде.

 

Для этого используется протокол позволяющий посылать переменные

независимо в отдельных пакетах. Publisher/subscriber.

 

     Укладывать спецификатором надо бы, но уж очень много параметров, длины неодинаковые. Предложил использовать модальные типы, сдвигать побитово умножением, складывать "or", зачищать масками через "and" и пр. Задающий задание такого решения не хочет, записывать в файл тоже не хочет (понятно почему), а предполагает всё же использовать спецификаторы и записывать по адресу в память… но не знает как.

 

Если коротко, никогда так не делайте. Геморрой и никакого выигрыша производительности. Реальные реализации протоколов кодируют и декодируют пакеты в машинные типы. Это проще и, в конечном, итоге быстрее, т.к. приложение - где требуется производительность. Кодирование - мелочь.

     Короче, перейти в другое отделение теперь мне не светит (не справился с заданием) — да и ладно для моего преклонного возраста, но ведь они молодые и сами не знают, а это уже заело, хочу понять решение. Просьба разъяснить или натолкнуть на мысль.

 

Вопрос чего?

 

ASN.1 так не работает.

 

Техническая проблема решается publisher/subscriber архитектурой и мультиплексированием.

 

Кстати. Yahoo прикрывает лавку.

 

Переходите в Usenet группы.

 

--

Regards,

Dmitry A. Kazakov

http://www.dmitry-kazakov.de

Мне кажется, что лучше пользоваться стандартными методами, но если нужно что-то не стандартное, то в начале пакета можно задать маску в 8 бит и в ней указать какие данные уложены в пакет, а затем все необходимые значения. Таким образом можно избежать дублирования информации, то есть передавать только то , что изменилось

 

On Tuesday, December 10, 2019, 11:11:50 p.m. GMT+2, Vladimir Troshin adaos@mail.ru [ada_ru] <ada_ru@yahoogroups.com> wrote:

 

 

               Здравствуйте коллеги! 

 

     Вынужден обратиться за помощью и разъяснить: как можно упаковать информацию нерегулярными порциями бит в одну длиннющую последовательность, ну, или короткую для начала. Дело касается ASN.1 который B2, кто в курсе. Смысл: географические данные — Широта (0..90) укладывается в размер 128 — то есть 7 бит, на следующую Долготу (0..180) это уже 256 потребуется 8 бит, далее Высота (метры или футы — различные пределы) и т.д. Да и ещё: во время следующей передачи данных высота может не задаваться — её достаточно передавать раз через пять на шестой. Переменных много и они могут то выпадать, то проявляться в этой общей череде.

     Укладывать спецификатором надо бы, но уж очень много параметров, длины неодинаковые. Предложил использовать модальные типы, сдвигать побитово умножением, складывать "or", зачищать масками через "and" и пр. Задающий задание такого решения не хочет, записывать в файл тоже не хочет (понятно почему), а предполагает всё же использовать спецификаторы и записывать по адресу в память… но не знает как. 

     Короче, перейти в другое отделение теперь мне не светит (не справился с заданием) — да и ладно для моего преклонного возраста, но ведь они молодые и сами не знают, а это уже заело, хочу понять решение. Просьба разъяснить или натолкнуть на мысль.

     

     P.S. Наткнулся случайно по ссылке с Ada User Journal /увидел знакомые фамилии Казаков и Дульман/ на гитхаб, что-ли, где разработка по теме ASN.1, но не могу понять, сложновато. Вероятно, существует более простое решение.

 

С уважением, Владимир.

 

--

Vladimir S. Troshin

 

[Non-text portions of this message have been removed]

 

 

 

[Non-text portions of this message have been removed]

 

Сначала Леониду. Спасибо за отклик, там оно собственно так и делается: в заголовочнике указываются (кодируются) нулями-единицами соответственно нет-есть данные по предписанной очереди, как-то так. Это не сутьь важно. Смысл - как подбить разнодлинные в битах параметры.

С уважением, Владимир.

 

>Среда, 11 декабря 2019, 7:12 +03:00 от Leonid Dulman leonid_dulman@yahoo.co.uk [ada_ru] <ada_ru@yahoogroups.com>:

>Мне кажется, что лучше пользоваться стандартными методами, но если нужно что-то не стандартное, то в начале пакета можно задать маску в 8 бит и в ней указать какие данные уложены в пакет, а затем все необходимые значения. Таким образом можно избежать дублирования информации, то есть передавать только то , что изменилось

 

>On Tuesday, December 10, 2019, 11:11:50 p.m. GMT+2, Vladimir Troshin adaos@mail.ru [ada_ru] < ada_ru@yahoogroups.com > wrote:

>... 

>С уважением, Владимир.

>--

>Vladimir S. Troshin

>---------------------------------------------------------------------- >Posted by: Leonid Dulman < leonid_dulman@yahoo.co.uk >

>---------------------------------------------------------------------- > 

>Reply via web post • Reply to sender • Reply to group • Start a New Topic • Messages in this topic (3)

>Visit Your Group

>• Privacy • Unsubscribe • Terms of Use

>.

 

 

 

--

Vladimir S. Troshin

 

 

[Non-text portions of this message have been removed]

 

Дмитрий! Чрезвычайно рад слышать, надеялся на Ваш ответ чёткий и рубленый, что и получил, спасибо))

Вчера прочитал и взял паузу. Не всё так окончательно. Пока сообщу неисчерпывающе: «предусматривается кодирование данных расширенного профиля… в массиве… в бит-запаковке согласно стандарту ASN.1 PER в составе нового пакета… Количество бит для сетей B2 рассчитывается по стандарту DO-351A том 2 раздел ADS». Стандарт RTCA, о нём вот здесь  https://my.rtca.org/NC__Product?id=a1B36000001Icf0EAC

     И да, просто человеку нет смысла его покупать, это когда по работе выдадут томик… Смысл в том, что время не стоит на месте и радиотраффик растёт в объёме на одну посылку, требует ужатия и, соответственно, ухищрений. 

 

Времени скучать на работе не дают, а здесь вот эти интересности. Вами заданные направления теперь буду изучать «до новых веников», навёрстывая пропущенное. Напишу в личную почту, если не возражаете, по мере осознания заданной мне по случаю абракадабры. Скорее на выходные.

 

Ну так ASN.1 так всё же работает.

 

Спасибо за сообщение, что пора отсюда перемещаться в Usenet группы, а то я как-то нечасто сюда захожу. 

 

С уважением, Владимир.

 

>Среда, 11 декабря 2019, 1:44 +03:00 от 'Dmitry A. Kazakov' alt@dmitry-kazakov.de [ada_ru] <ada_ru@yahoogroups.com>:

 

 

>On 2019-12-10 22:11, Vladimir Troshin adaos@mail.ru [ada_ru] wrote:

 

     Вынужден обратиться за помощью и разъяснить: как можно упаковать информацию нерегулярными порциями бит в одну длиннющую последовательность, ну, или короткую для начала. Дело касается ASN.1 который B2, кто в курсе.

 

>ASN.1 как раз не пакует битовые последовательности. В ASN.1 они

>выравниваются на границу октета. Неиспользованные биты маскируются. Если >интересно см. Simple Components пакет

>GNAT.Sockets.Connection_State_Machine.ASN1.Bit_Strings

 

>Смысл: географические данные — Широта (0..90) укладывается в размер >128 — то есть 7 бит, на следующую Долготу (0..180) это уже 256

>потребуется 8 бит, далее Высота (метры или футы — различные пределы) и >т.д. Да и ещё: во время следующей передачи данных высота может не >задаваться — её достаточно передавать раз через пять на шестой.

>Переменных много и они могут то выпадать, то проявляться в этой общей >череде.

 

>Для этого используется протокол позволяющий посылать переменные

>независимо в отдельных пакетах. Publisher/subscriber.

 

     Укладывать спецификатором надо бы, но уж очень много параметров, длины неодинаковые. Предложил использовать модальные типы, сдвигать побитово умножением, складывать "or", зачищать масками через "and" и пр. Задающий задание такого решения не хочет, записывать в файл тоже не хочет (понятно почему), а предполагает всё же использовать спецификаторы и записывать по адресу в память… но не знает как.

 

>Если коротко, никогда так не делайте. Геморрой и никакого выигрыша >производительности. Реальные реализации протоколов кодируют и декодируют >пакеты в машинные типы. Это проще и, в конечном, итоге быстрее, т.к. >приложение - где требуется производительность. Кодирование - мелочь.

     Короче, перейти в другое отделение теперь мне не светит (не справился с заданием) — да и ладно для моего преклонного возраста, но ведь они молодые и сами не знают, а это уже заело, хочу понять решение. Просьба разъяснить или натолкнуть на мысль.

 

>Вопрос чего?

 

>ASN.1 так не работает.

 

>Техническая проблема решается publisher/subscriber архитектурой и >мультиплексированием.

 

>Кстати. Yahoo прикрывает лавку.

 

>Переходите в Usenet группы.

 

>--

>Regards,

>Dmitry A. Kazakov

>http://www.dmitry-kazakov.de

 

 

 

--

Vladimir S. Troshin

 

 

[Non-text portions of this message have been removed]

On 2019-12-12 22:06, Vladimir Troshin adaos@mail.ru [ada_ru] wrote:

Вчера прочитал и взял паузу. Не всё так окончательно. Пока сообщу неисчерпывающе: «предусматривается кодирование данных расширенного профиля… в массиве… в бит-запаковке согласно стандарту ASN.1 PER в составе нового пакета… Количество бит для сетей B2 рассчитывается по стандарту DO-351A том 2 раздел ADS». Стандарт RTCA, о нём вот здесь  https://my.rtca.org/NC__Product?id=a1B36000001Icf0EAC

 

Много букв. Навскидку это может значить, что данные запихиваются в ASN.1 BIT STRING как blob.

 

Я же из Вашего поста подумал, что Вы хотите каждое значение запаковать в отдельный bit string, а все вместе в ASN.1 последовательность, где каждая BIT STRING опциональна. Т.е. на языке ASN.1

 

SEQUENCE

{ Height [0] BIT STRING OPTIONAL,

Width [1] BIT STRING OPTIONAL,

Length [2] BIT STRING OPTIONAL

}

 

Так вот, это ничего не пакует. Все части будут выравнены на границу октетов. Более того, ASN.1 добавит кучу мусора. ASN.1 - сильно неэффективен.

Если интересно, есть on-line трансляторы с ASN.1 и можно посмотреть во что это все выльется в байтах.

 

     И да, просто человеку нет смысла его покупать, это когда по работе выдадут томик… Смысл в том, что время не стоит на месте и радиотраффик растёт в объёме на одну посылку, требует ужатия и, соответственно, ухищрений.

 

А это уже - сложный вопрос. В принципе, mission critical и/или real time смстемы проектируются исходя из самого худшего варианта. Т.е. без сжатия, если оное не всегда работает.

 

Например Вы резервируете трафик для всех значений на случай что их таки придется посылать.

 

Если трафика много, данные посылаются в разные циклы. Например,

температура измеряется медленно, каждую секунду. А угол поворота вала каждые десять миллисекунд. Соответственно пакеты с температурой

посылаются сильно реже.

 

Времени скучать на работе не дают, а здесь вот эти интересности. Вами заданные направления теперь буду изучать «до новых веников», навёрстывая пропущенное. Напишу в личную почту, если не возражаете, по мере осознания заданной мне по случаю абракадабры. Скорее на выходные.

 

Валяйте. Тем более, что Yahoo вырубит свет 14 декабря.

 

--

Regards,

Dmitry A. Kazakov

http://www.dmitry-kazakov.de

On 13/12/2019 03.06, Vladimir Troshin adaos@mail.ru [ada_ru] wrote:

 

 

бит-запаковке согласно стандарту ASN.1 PER в составе нового пакета…

Вот это, не пробовали.

 

https://github.com/ttsiodras/asn1scc

 

Я когда то этим пользовался, забыл уже зачем. Вроде чего то получалось.

 

 

[Non-text portions of this message have been removed]

 

Что-то Вы меня обеспокоили, а посему как лучше реагировать на Ваше  

- Кстати. Yahoo прикрывает лавку.

  Переходите в Usenet группы."

>Валяйте. Тем более, что Yahoo вырубит свет 14 декабря.

Где наша Usenet группа? Где взять ссылку?

 

Заглянул по ссылке  https://t.me/adalang от Дмитрия Анисимкова со своего телефона — там пока не очень интересный разговор.

Предполагаю, что сохранится форум на http://ada-ru.org/forum/index.html — там пока не регистрировался. 

На ru.wikipedia.org есть info, что надо от действующего участника получить ссылку на конкретный Usenet — где наши ребята спрятались?

 

--

Vladimir S. Troshin

 

 

[Non-text portions of this message have been removed]

 

Дмитрий, да, с этого гитхаба всё и началось, самый первый пост, в строчках P.S. упоминается именно он.

 

Мне даже не первая часть ASN.1 интересна (в гитхаб крепко не лез), а сам способ пристыковки разнодлинных групп единиц и ноликов, не кратных байту (октету), в общую непрерывную «макаронину». Финальный аккорд — закрыть конечный байт (октет) этого набора недостающими нулями или чем там. Если я правильно понял.

 

Теперь вот на выходные можно будет почитать до ГОСТ ИСО/МЭК 8825 «… Правила кодирования АСН.1. Часть 2...»

 

С уважением, Владимир.

>Пятница, 13 декабря 2019, 14:57 +03:00 от Dmitriy Anisimkov anisimkov@ada-ru.org [ada_ru] <ada_ru@yahoogroups.com>:

>On 13/12/2019 03.06, Vladimir Troshin adaos@mail.ru [ada_ru] wrote:

 

 

бит-запаковке согласно стандарту ASN.1 PER в составе нового пакета…

>Вот это, не пробовали.

 

>https://github.com/ttsiodras/asn1scc

 

>Я когда то этим пользовался, забыл уже зачем. Вроде чего то получалось.

>[Non-text portions of this message have been removed]

 

 

 

--

Vladimir S. Troshin

 

 

[Non-text portions of this message have been removed]

On 2019-12-13 21:38, Vladimir Troshin adaos@mail.ru [ada_ru] wrote:

Мне даже не первая часть ASN.1 интересна (в гитхаб крепко не лез), а сам способ пристыковки разнодлинных групп единиц и ноликов, не кратных байту (октету), в общую непрерывную «макаронину». Финальный аккорд — закрыть конечный байт (октет) этого набора недостающими нулями или чем там. Если я правильно понял.

 

Не знаю хорошего метода, в том смысле, что он будет более эффективен, чем выравнивание на границу октета.

 

Например, тупой метод:

 

11 = разделитель полей

10 = 1

0 = 0

 

Пример:

 

101001|10|1|00-> код: 10 0 10 0 0 10 11 10 0 11 10 11 0 0

 

Хвост забивается единицами (разделителем). Итого, полтора к одному.

--

Regards,

Dmitry A. Kazakov

http://www.dmitry-kazakov.de

 

Да вот призадержался с ответом, т.к. в субботу утром заглянул и не понял идеи — нет, не «с бодуна», не употребляю, или крайне редко. Не понял принципа упаковки и зачем здесь разделители полей.

>Суббота, 14 декабря 2019, 1:04 +03:00 от 'Dmitry A. Kazakov' alt@dmitry-kazakov.de [ada_ru] <ada_ru@yahoogroups.com>:

>On 2019-12-13 21:38, Vladimir Troshin adaos@mail.ru [ada_ru] wrote:

Мне даже не первая часть ASN.1 интересна (в гитхаб крепко не лез), а сам способ пристыковки разнодлинных групп единиц и ноликов, не кратных байту (октету), в общую непрерывную «макаронину». Финальный аккорд — закрыть конечный байт (октет) этого набора недостающими нулями или чем там. Если я правильно понял.

 

>Не знаю хорошего метода, в том смысле, что он будет более эффективен, >чем выравнивание на границу октета.

 

>Например, тупой метод:

 

>11 = разделитель полей

>10 = 1

>0 = 0

 

>Пример:

 

>101001|10|1|00-> код: 10 0 10 0 0 10 11 10 0 11 10 11 0 0

 

>Хвост забивается единицами (разделителем). Итого, полтора к одному.

>--

>Regards,

>Dmitry A. Kazakov

>http://www.dmitry-kazakov.de

 

>---------------------------------------------------------------------- >Posted by: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov..de>

>---------------------------------------------------------------------- > 

>Reply via web post • Reply to sender • Reply to group • Start a New Topic • Messages in this topic (10)

>Visit Your Group

>• Privacy • Unsubscribe • Terms of Use

>.

>_,_._,___

 

Здесь не получается сокращения объёма передаваемой информации. Ушёл развеятся, а вечером засел за написание, или разъяснение того, что выпалил скороговоркой и, возможно, непонятно. Излагал в меру своей скромной работоспособности до глубокой ночи. Утром проснулся, пересчитал биты, исправил, дополнил… Лучшее — враг хорошего. Краткость — сестра таланта, мне не присуща, вынужден признать. Но привожу свои измышлизмы…

- -

Письмо I Казакову Дмитрию

Уважаемый Дмитрий!

Эта самая часть вторая, обозначается в английском написании “ B 2”, применяет следующую, как я понимаю, концепцию уплотнения: использование минимально достаточного количества разрядов (бит) для представления данных в упаковке. Места в упакованном формате предопределены заранее. Наличие или отсутствие конкретного параметра задаётся в заголовочнике. Ориентировочно что-то наподобие нижеследующего.

Заголовочник (здесь указаны номера бит)

8-й бит (х,1) Номер ВС (воздушного судна) – всегда присутствует “1” 7-й бит (0,1 – не присутствует или присутствует соответственно) Широта 6-й бит (0,1) Долгота

5-й бит (0,1) Высота

4-й бит (0,1) Дата

3-й бит (0,1) Время

2-й бит (0,1) Резерв – всегда “0”

1-й бит (0,1) Резерв – всегда “0”

Ёмкость данных (здесь указана ёмкость в битах на параметр)

6 бит Номер ВС (здесь я сократил, в действительности выделяется 24 бита) 7 бит Широта (0..90 – в рамках 128)

8 бит Долгота (0..180 – в рамках 256)

10 бит Высота (30..700 ` ft ) – приведённые футы (1` ft = 100 ft ) 15 бит Дата :

6 бит Год (1996..2059) Сейчас 2019 – 1996 = 23-й год !!!

4 бит Месяц (1..12)

5 бит День (1..31)

17 бит Время :

5 бит Часы (0..23)

6 бит Минуты (0..59)

6 бит Секунды (0..59)

Зададим параметры, произвольно, пусть это Бологое, к вечеру, высота 11 км: 10

9

8

7

6

5

4

3

2

1

 

Номера бит

 

 

 

 

0

1

1

1

0

0

28

Номер ВС

 

 

 

0

1

1

1

0

1

0

58

Широта, град

 

 

0

0

1

0

0

0

1

0

34

Долгота, град

0

1

0

1

1

0

1

0

0

1

361

Высота, ` ft (около 11 тыс.м)

 

 

 

 

0

1

0

1

1

1

23

Год (2019 – 1996 = 23)

 

 

 

 

 

 

1

1

0

0

12

Месяц (декабрь)

 

 

 

 

 

0

1

1

1

0

14

День (14-й)

 

 

 

 

 

1

0

0

0

1

17

Часов

 

 

 

 

0

1

1

1

1

0

30

Минут

 

 

 

 

0

1

0

0

1

1

19

Секунд

Пусть все параметры заданы заголовком: ‘11111100’ – Номер ВС, Широта, Долгота, Высота, Дата (Год, Месяц, День), Время (Часы, Минуты, Секунды) [Резерв нет, Резерв нет].

0 1 1 1 0 0                      – Номер ВС

0 1 1 1 0 1 0                  – Широта

0 0 1 0 0 0 1 0              – Долгота

0 1 0 1 1 0 1 0 0 1    – Высота

0 1 0 1 1 1                       – Год

1 1 0 0                                 – Месяц

0 1 1 1 0                            – День

1 0 0 0 1                            – Часов

0 1 1 1 1 0                       – Минут

0 1 0 0 1 1                       – Секунд

Тогда заявленный заголовком ‘11111100’ набор будет иметь такую упаковку: 11111100 011100 0111010 00100010 0101101001 010111 1100 01110 10001 011110 010011 x – всего 72 бита, где первым идёт заголовок (бесцветный), затем данные – окрашены соответственно, символ “ x ” – дополняющий количество бит до кратности байта, этакий хвост, его назначение – закрыть последний октет.

Далее рассмотрим усечённый вариант, когда передаются не все данные. Заголовок ‘11100100’ задаёт: Номер ВС, Широта, Долгота, [Высоты нет, Даты нет,] Время (Часы, Минуты, Секунды) [Резерв - нет, Резерв - нет].

Такой сокращённый набор (без передачи Высоты и Даты) будет выглядеть так: 11100100 011100 0111010 00100010 10001 011110 010011 xx – всего 48 бит, хвост из двух символов “ x ” дополняет количество бит до кратности восемь, чем закрывает последний октет. Здесь символы “ x ” – это или единицы, или нули, или как там предписано.

  С уважением, Трошин В.С., воскресенье, 15 декабря 2019 г. 02:24:41

- -

Согласитесь, что если год измерять в период из 63 лет (влезает в 6 бит), а не от Рождества Христова 2019 год (11 бит, в пределах 2048), или от Сотворения Мира 7528 г (13 бит, в пределах 8192), то бит потребуется меньше 6 против 11 или 13. Как и высоту указываем в сотнях футов в пределах и пр.

Порядок информационных блоков строго задан.

Длины информационных блоков жёстко заданы. 

Наличие или отсутствие того или иного информ блока строго задано (0,1) в заголовке. 

Длина заголовка строго фиксирована.

     Теперь, когда эти информационные блоки определены — их порядок, наличие, длины — их можно состыковать: последующий нос к впереди идущему хвосту. И не важно, какое там внутри этой цветной «колбасы» деление на байты, прозванные октетами, главное, для отсутствия конфликта с архитектурой разнообразия железа и операционок, закрываем недостающие биты в байтах-октетах (не важно чем). Разделителей никаких не нужно.

     В воздухе десятки тысяч самолётов, нынешний коммерсант желает знать: где пролетает транспортируемый им «Катерпиллер» или партия живых устриц — успеет ли он к обещанному сроку доставки или сам влетает «в копеечку» (в цент). Траффик с бортом перегрет, а потому дорог, каждый несэкономленный бит вырастает в терабайт.

     Так как это оформить на нашей любимой Аде?

 

С уважением, многа букафф, простите...

 

 

--

Vladimir S. Troshin

 

 

[Non-text portions of this message have been removed]

 

Sorry. Что-то я нарушил и не прошла таблица, вынужден пристегнуть файл-письмо....

 

 

>Суббота, 14 декабря 2019, 1:04 +03:00 от 'Dmitry A. Kazakov' alt@dmitry-kazakov.de [ada_ru] <ada_ru@yahoogroups.com>:

>On 2019-12-13 21:38, Vladimir Troshin adaos@mail.ru [ada_ru] wrote:

Мне даже не первая часть ASN.1 интересна (в гитхаб крепко не лез), а сам способ пристыковки разнодлинных групп единиц и ноликов, не кратных байту (октету), в общую непрерывную «макаронину». Финальный аккорд — закрыть конечный байт (октет) этого набора недостающими нулями или чем там. Если я правильно понял.

 

>Не знаю хорошего метода, в том смысле, что он будет более эффективен, >чем выравнивание на границу октета.

 

>Например, тупой метод:

 

>11 = разделитель полей

>10 = 1

>0 = 0

 

>Пример:

 

>101001|10|1|00-> код: 10 0 10 0 0 10 11 10 0 11 10 11 0 0

 

>Хвост забивается единицами (разделителем). Итого, полтора к одному.

>--

>Regards,

>Dmitry A. Kazakov

>http://www.dmitry-kazakov.de

 

 

 

--

Vladimir S. Troshin

 

 

[Non-text portions of this message have been removed]

 

 

Вынужден продублировать...

 

>Воскресенье, 15 декабря 2019, 14:23 +03:00 от Vladimir Troshin adaos@mail.ru [ada_ru] <ada_ru@yahoogroups.com>:

 

>Да вот призадержался с ответом, т.к. в субботу утром заглянул и не понял идеи — принципа упаковки и зачем здесь разделители полей.

>Здесь не получается сокращения объёма передаваемой информации.

… 

>Ушёл развеятся, а вечером засел за написание, или разъяснение того, что выпалил скороговоркой и, возможно, непонятно. Излагал в меру своей скромной работоспособности до глубокой ночи. Утром проснулся, пересчитал биты, исправил, дополнил… Лучшее — враг хорошего. Краткость — сестра таланта, мне не присуща, вынужден признать. Но привожу свои измышлизмы…- -

Здесь читать письмо (прилагается, если пролезет в почту)

>- -

>Согласитесь, что если год измерять в период из 63 лет (влезает в 6 бит), а не от Рождества Христова 2019 год (11 бит, в пределах 2048), или от Сотворения Мира 7528 г (13 бит, в пределах 8192), то бит потребуется меньше 6 против 11 или 13. Как и высоту указываем в сотнях футов в пределах и пр.

>Порядок информационных блоков строго задан.

>Длины информационных блоков жёстко заданы. 

>Наличие или отсутствие того или иного информ блока строго задано (0,1) в заголовке. 

>Длина заголовка строго фиксирована.

>     Теперь, когда эти информационные блоки определены — их порядок, наличие, длины — их можно состыковать: последующий нос к впереди идущему хвосту. И не важно, какое там внутри этой цветной «колбасы» деление на байты, прозванные октетами, главное, для отсутствия конфликта с архитектурой разнообразия железа и операционок, закрываем недостающие биты в байтах-октетах (не важно чем). Разделителей никаких не нужно.

>     В воздухе десятки тысяч самолётов, нынешний коммерсант желает знать: где пролетает транспортируемый им «Катерпиллер» или партия живых устриц — успеет ли он к обещанному сроку доставки или сам влетает «в копеечку» (в цент). Траффик с бортом перегрет, а потому дорог, каждый несэкономленный бит вырастает в терабайт.

>     Так как это оформить на нашей любимой Аде?

>С уважением, многа букафф, простите...

>--

>Vladimir S. Troshin

 

>[Non-text portions of this message have been removed]

 

 

 

--

Vladimir S. Troshin

 

 

[Non-text portions of this message have been removed]

On 2019-12-15 12:23, Vladimir Troshin adaos@mail.ru [ada_ru] wrote:

 

Да вот призадержался с ответом, т.к. в субботу утром заглянул и не понял идеи — нет, не «с бодуна», не употребляю, или крайне редко. Не понял принципа упаковки и зачем здесь разделители полей.

 

Чтобы знать где конец, а где начало части подпоследовательности. Я сначала понял, что длина подпоследовательности варьируется.

Подпоследовательности фиксированной длинны пишите как есть.

 

Эта самая часть вторая, обозначается в английском написании “ B 2”, применяет следующую, как я понимаю, концепцию уплотнения: использование минимально достаточного количества разрядов (бит) для представления данных в упаковке. Места в упакованном формате предопределены заранее. Наличие или отсутствие конкретного параметра задаётся в заголовочнике. Ориентировочно что-то наподобие нижеследующего.

Заголовочник (здесь указаны номера бит)

8-й бит (х,1) Номер ВС (воздушного судна) – всегда присутствует “1” 7-й бит (0,1 – не присутствует или присутствует соответственно) Широта 6-й бит (0,1) Долгота

5-й бит (0,1) Высота

4-й бит (0,1) Дата

3-й бит (0,1) Время

2-й бит (0,1) Резерв – всегда “0”

1-й бит (0,1) Резерв – всегда “0”

Ёмкость данных (здесь указана ёмкость в битах на параметр)

6 бит Номер ВС (здесь я сократил, в действительности выделяется 24 бита) 7 бит Широта (0..90 – в рамках 128)

8 бит Долгота (0..180 – в рамках 256)

10 бит Высота (30..700 ` ft ) – приведённые футы (1` ft = 100 ft ) 15 бит Дата :

6 бит Год (1996..2059) Сейчас 2019 – 1996 = 23-й год !!!

4 бит Месяц (1..12)

5 бит День (1..31)

17 бит Время :

5 бит Часы (0..23)

6 бит Минуты (0..59)

6 бит Секунды (0..59)

 

Ну это раскодировать элементарно. Не понимаю, что вызывает затруднения. Читаете биты, складываете их по формуле двоичного представления числа. Я предполагаю из примера, что у Вас большие индейцы, т.е.

 

function Read_Hour (Input : Bit_Stream) return Hour_Number is

Hour : Hour_Number;

begin

Hour := Read_Bit (Input); -- First bit

Hour := Hour * 2 + Read_Bit (Input); -- Second bit

Hour := Hour * 2 + Read_Bit (Input);

Hour := Hour * 2 + Read_Bit (Input);

Hour := Hour * 2 + Read_Bit (Input); -- Last bit

return Hour;

end Read_Hour;

 

Пример:

 

10001

 

= 1;

1*2 + 0 = 2

2*2 + 0 = 4

4*2 + 0 = 8

8*2 + 1 = 17

 

В чем проблема?

 

Согласитесь, что если год измерять в период из 63 лет (влезает в 6 бит), а не от Рождества Христова 2019 год (11 бит, в пределах 2048), или от Сотворения Мира 7528 г (13 бит, в пределах 8192), то бит потребуется меньше 6 против 11 или 13. Как и высоту указываем в сотнях футов в пределах и пр.

 

Это называется эпохой. У Вас - 1 January 1995 00:00. В начале, или периодически, посылается текущая эпоха в длинном формате, а затем короткие инкременты к ней. Время, обычно, не делится на часы и минуты как у Вас, а посылается как количество секунд (у нас - десятых

микросекунды от эпохи). Это проще и компактнее, особенно, если эпоха передвигается на последнее время посылки. Тогда, инкременты совсем маленькие, и хватает оного байта (всегда 4 байта, у Вас), при

использовании цепочечного кода.

 

Порядок информационных блоков строго задан.

Длины информационных блоков жёстко заданы.

Наличие или отсутствие того или иного информ блока строго задано (0,1) в заголовке.

Длина заголовка строго фиксирована.

 

Это, как я уже сказал, - элементарно. Читаете заголовок. Затем

 

if Have_Altitude then

Altitude := Read_Altitude (Input);

end if;

if Have_Longtitude then

Longtitude := Read_Longtitude (Input);

end if;

...

 

     Теперь, когда эти информационные блоки определены — их порядок, наличие, длины — их можно состыковать: последующий нос к впереди идущему хвосту. И не важно, какое там внутри этой цветной «колбасы» деление на байты, прозванные октетами, главное, для отсутствия конфликта с архитектурой разнообразия железа и операционок, закрываем недостающие биты в байтах-октетах (не важно чем). Разделителей никаких не нужно.

 

Да, если поля фиксированные. Обычно, это не так. Например, целые числа часто кодируются цепочечным кодом переменной длинны. Тот же ASN.1 так кодирует длины полей.

 

     Так как это оформить на нашей любимой Аде?

 

См. выше.

 

--

Regards,

Dmitry A. Kazakov

http://www.dmitry-kazakov.de

Смысл - как подбить разнодлинные в битах параметры.

 

Я когда-то писал распаковку zip формата для Матрёшки, чтобы легче было оперировать битами

написал такой класс/тип Bit_Stream. Кладёшь в него массив байт, а читаешь указывая

сколько бит нужно:

 

not overriding procedure Read

(Self : in out Bit_Stream;

Count : Bit_Count;

Value : in out Bits);

-- Read from stream given Count of bits.

-- Precondition: Self.Has_Bits (Count)

Полный текст можно посмотреть тут:

 

http://forge.ada-ru.org/matreshka/browser/trunk/design/filters/matreshka-filters-bit_streams.ads

 

http://forge.ada-ru.org/matreshka/browser/trunk/design/filters/matreshka-filters-bit_streams.adb

 

Так, счастье [понимание] приближается, но пока отщипну с краю дополню. 

 

>Воскресенье, 15 декабря 2019, 16:49 +03:00 от 'Dmitry A. Kazakov' alt@dmitry-kazakov.de [ada_ru] <ada_ru@yahoogroups.com>:

>On 2019-12-15 12:23, Vladimir Troshin adaos@mail.ru [ada_ru] wrote:

 

Да вот призадержался с ответом, т.к. в субботу утром заглянул и не понял идеи — нет, не «с бодуна», не употребляю, или крайне редко. Не понял принципа упаковки и зачем здесь разделители полей.

 

>Чтобы знать где конец, а где начало части подпоследовательности. Я >сначала понял, что длина подпоследовательности варьируется.

>Подпоследовательности фиксированной длинны пишите как есть.

 

Подпоследовательность — Долгота — всегда укладывается в одну длину бит (в примитиве пусть будет так). Высота — высот много: Высота в метрах такая, Высота в метрах разэтакая, Высота в футах такая-то… каждая может быть своего подтипа (диапазона высот: одна -300..20000, другая 30..700), но эта каждая всегда одной своей длины бит. И авиаторам нужна то одна, то другая.

 

Эта самая часть вторая, обозначается в английском написании “ B 2”, применяет следующую, как я понимаю, концепцию уплотнения: использование минимально достаточного количества разрядов (бит) для представления данных в упаковке. Места в упакованном формате предопределены заранее. Наличие или отсутствие конкретного параметра задаётся в заголовочнике. Ориентировочно что-то наподобие нижеследующего.

Заголовочник (здесь указаны номера бит)

8-й бит (х,1) Номер ВС (воздушного судна) – всегда присутствует “1” 7-й бит (0,1 – не присутствует или присутствует соответственно) Широта 6-й бит (0,1) Долгота

5-й бит (0,1) Высота

4-й бит (0,1) Дата

3-й бит (0,1) Время

2-й бит (0,1) Резерв – всегда “0”

1-й бит (0,1) Резерв – всегда “0”

Ёмкость данных (здесь указана ёмкость в битах на параметр)

6 бит Номер ВС (здесь я сократил, в действительности выделяется 24 бита) 7 бит Широта (0..90 – в рамках 128)

8 бит Долгота (0..180 – в рамках 256)

10 бит Высота (30..700 ` ft ) – приведённые футы (1` ft = 100 ft ) 15 бит Дата :

6 бит Год (1996..2059) Сейчас 2019 – 1996 = 23-й год !!!

4 бит Месяц (1..12)

5 бит День (1..31)

17 бит Время :

5 бит Часы (0..23)

6 бит Минуты (0..59)

6 бит Секунды (0..59)

 

>Ну это раскодировать элементарно. Не понимаю, что вызывает затруднения. >Читаете биты, складываете их по формуле двоичного представления числа. Я >предполагаю из примера, что у Вас большие индейцы, т.е.

 

>function Read_Hour (Input : Bit_Stream) return Hour_Number is

>Hour : Hour_Number;

>begin

>Hour := Read_Bit (Input); -- First bit

>Hour := Hour * 2 + Read_Bit (Input); -- Second bit

>Hour := Hour * 2 + Read_Bit (Input);

>Hour := Hour * 2 + Read_Bit (Input);

>Hour := Hour * 2 + Read_Bit (Input); -- Last bit

>return Hour;

>end Read_Hour;

 

>Пример:

 

>10001

 

>= 1;

>1*2 + 0 = 2

>2*2 + 0 = 4

>4*2 + 0 = 8

>8*2 + 1 = 17

«Индейцы» большие: последовательности от коротких четырёх до длинных более двадцати четырёх. Пока ограничения на суммарную длину посылки [склеенных из подпоследовательностей] информации до 1024 байт.

>В чем проблема?

 

Согласитесь, что если год измерять в период из 63 лет (влезает в 6 бит), а не от Рождества Христова 2019 год (11 бит, в пределах 2048), или от Сотворения Мира 7528 г (13 бит, в пределах 8192), то бит потребуется меньше 6 против 11 или 13. Как и высоту указываем в сотнях футов в пределах и пр.

 

>Это называется эпохой. У Вас - 1 January 1995 00:00. В начале, или >периодически, посылается текущая эпоха в длинном формате, а затем >короткие инкременты к ней. Время, обычно, не делится на часы и минуты >как у Вас, а посылается как количество секунд (у нас - десятых

>микросекунды от эпохи). Это проще и компактнее, особенно, если эпоха >передвигается на последнее время посылки. Тогда, инкременты совсем >маленькие, и хватает оного байта (всегда 4 байта, у Вас), при

>использовании цепочечного кода.

Да, кто хоть однажды видел это, тот не забудет никогда — это наше-ваше число 86400. Но здесь всё по другому: RTCA в документе DO-351 ред. A предписывает представлять дату и время именно так. Там множество вариантов казалось бы одного и того же, но таковы требования, изложенные на более чем 180 страницах.

 

Порядок информационных блоков строго задан.

Длины информационных блоков жёстко заданы.

Наличие или отсутствие того или иного информ блока строго задано (0,1) в заголовке.

Длина заголовка строго фиксирована.

 

>Это, как я уже сказал, - элементарно. Читаете заголовок. Затем

 

>if Have_Altitude then

>Altitude := Read_Altitude (Input);

>end if;

>if Have_Longtitude then

>Longtitude := Read_Longtitude (Input);

>end if;

>...

 

     Теперь, когда эти информационные блоки определены — их порядок, наличие, длины — их можно состыковать: последующий нос к впереди идущему хвосту. И не важно, какое там внутри этой цветной «колбасы» деление на байты, прозванные октетами, главное, для отсутствия конфликта с архитектурой разнообразия железа и операционок, закрываем недостающие биты в байтах-октетах (не важно чем). Разделителей никаких не нужно.

 

>Да, если поля фиксированные. Обычно, это не так. Например, целые числа >часто кодируются цепочечным кодом переменной длинны. Тот же ASN.1 так >кодирует длины полей.

 

     Так как это оформить на нашей любимой Аде?

 

>См. выше.

 

>--

>Regards,

>Dmitry A. Kazakov

>http://www.dmitry-kazakov.de

 

 

 

--

Vladimir S. Troshin

 

 

[Non-text portions of this message have been removed]

 

Добрый вечер, Максим! Давно не общались.

 

За отклик спасибо, к Матрёшке подступаться не собирался как-то, но завтра решение посмотрю обязательно.

>Воскресенье, 15 декабря 2019, 19:58 +03:00 от Максим Резник ada_ru@forge.ada-ru.org [ada_ru] <ada_ru@yahoogroups.com>:

Смысл - как подбить разнодлинные в битах параметры.

 

>Я когда-то писал распаковку zip формата для Матрёшки, чтобы легче было оперировать битами

>написал такой класс/тип Bit_Stream. Кладёшь в него массив байт, а читаешь указывая

>сколько бит нужно:

 

>not overriding procedure Read

>(Self : in out Bit_Stream;

>Count : Bit_Count;

>Value : in out Bits);

>-- Read from stream given Count of bits.

>-- Precondition: Self.Has_Bits (Count)

 

>Полный текст можно посмотреть тут:

 

>http://forge.ada-ru.org/matreshka/browser/trunk/design/filters/matreshka-filters-bit_streams.ads

 

>http://forge.ada-ru.org/matreshka/browser/trunk/design/filters/matreshka-filters-bit_streams.adb

 

>---------------------------------------------------------------------- >Posted by: =?utf-8?b?0JzQsNC60YHQuNC8INCg0LXQt9C90LjQug==?= < ada_ru@forge.ada-ru.org >

>---------------------------------------------------------------------- > 

>Reply via web post • Reply to sender • Reply to group • Start a New Topic • Messages in this topic (15)

>Visit Your Group

>• Privacy • Unsubscribe • Terms of Use

>.

 

С уважением, Владимир.

 

 

--

Vladimir S. Troshin

 

 

[Non-text portions of this message have been removed]

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти