Алатка структура

Опште

Алатка структура омогућава анализирање и уређивање низова бајтова на основу кориснички задатих дефиниција структура, које се могу састојати од низова, унија, примитивних типова и набројивих вредности.

Поседује сопствени дијалог поставки, који се позива дугметом Поставке. Могу се подесити разне опције, попут стила приказа вредности (декадно, хексадекадно, бинарно). Могуће је изабрати које се дефиниције структура учитавају и које структуре се виде у приказу.

Структура се дефинише у фајлу Октетине дефиниције структуре (ИксМЛ формат са наставком .osd). На ово се додаје и .desktop фајл са метаподацима о фајлу описа структуре, попут аутора, домаће странице и лиценце.

Тренутно нема уграђене подршке за стварање и уређивање дефиниција структура, већ се то мора ручно радити како је описано у наредним одељцима.

Инсталирање дефиниција структура

Инсталирање преко врућих новотарија

Нове дефиниције структура најлакше се инсталирају путем подршке за вруће новотарије уграђене у Октети. Да бисте инсталирали постојећу структуру, отворите дијалог поставки алатке за структуре. У њему идите под језичак Управљање структурама и кликните на дугме Добави нове структуре.... Дијалог који се на то појави омогућава вам инсталирање и деинсталирање структура.

Ручно инсталирање дефиниција структура

Алатка структура тражи описе структура у потфасцикли okteta/structures/ корисничке фасцикле за податке програма̂ (коју налазите извршавањем qtpaths --paths GenericDataLocation). Можда ћете морати да направите ову фасциклу, ако још увек нема ниједне инсталиране дефиниције структуре.

За сваку дефиницију структуре постоје два фајла: један за саму дефиницију, и један .desktop фајл за метаподатке (аутор, верзија, итд.).

У наведеној фасцикли, свака дефиниција структуре има своју потфасциклу која садржи и .desktop и .osd или main.js фајл дефиниције.

На пример, ако је фасцикла података програма̂ qtpaths --paths GenericDataLocation а име дефиниције структуре PrimerStrukture, онда постоји фасцикла okteta/structures/ExampleStructure која садржи фајлове PrimerStrukture.desktop и PrimerStrukture.osd.

Коришћење инсталираних структура

Пошто инсталирате нову дефиницију структуре, да бисте је користили морате поново покренути Октету. Пошто то учините, отворите дијалог поставки алатке за структуре. Идите на језичак Управљање структурама и обезбедите да је одговарајућа дефиниција структуре активирана. Затим пређите на језичак Структуре и проверите да ли је жељени елемент приказан на десној страни.

Дељење дефиниција структура

За уобичајене структуре можда не морате сами стварати дефиниције, већ се можете послужити постојећим дефиницијама са места̂ попут store.kde.org.

Такође можете пожелети да поделите своје дефиниције. То чините тако што направите архиву (нпр. типа .tar.gz) која садржи само потфасциклу са .desktop фајлом и фајлом дефиниције структуре. Настављајући пример из претходног одељка, ово би била фасцикла PrimerStrukture са својим потпуним садржајем. Употреба овог формата за дељење дефиниција структура омогућава њихово инсталирање у Октети без ручних захвата.

Стварање дефиниција структура

Примедба

Новији, али још недовршени, водич за писање дефиниција структура може се наћи на викију Корисничке базе КДЕ‑а.

Дефиниције структура могу се стварати на два начина. Први је писање дефиниције у ИксМЛ‑у, а други употребом јаваскрипта. Приступ јаваскриптом омогућава вам да израдите сложеније структуре, са могућностима попут, рецимо, оверавања структуре. ИксМЛ пружа мање могућности, али може бити најлакши приступ ако је статичка структура све што вам треба. Ако желите динамичку структуру, нпр. где дужине низова зависе од других вредности из структуре, или се распоред структуре мења са променом вредности неких чланова, мораћете да напишете дефиницију структуре на јаваскрипту. Овоме има један изузетак: ако дужина низа треба да буде тачно једнака некој другој вредности из структуре, то се може задати и ИксМЛ‑ом; али ако је нешто попут дужина - 1, тада мора јаваскрипт.

ИксМЛ формат фајла за дефинисање структура

Примедба

Новији, али још недовршени, водич за писање дефиниција структура може се наћи на викију Корисничке базе КДЕ‑а.

.osd ИксМЛ фајл има један корени елемент: <data>, без атрибута. Унутар овог елемента мора стојати један од следећих:

<primitive>

За стварање примитивних типова података, попут int или float. Овај елемент нема поделемената, а може имати следеће атрибуте:

type

Тип овог примитивног типа. Мора бити један од следећих:

  • char за 8‑битни аски знак

  • int8, int16, int32, int64 за означени целобројни те величине

  • uint8, uint16, uint32, uint64 за неозначени целобројни те величине

  • bool8, bool16, bool32, bool64 за неозначени логички (0 = нетачно, било шта друго = тачно) те величине

  • float за 32‑битни број у покретном зарезу (ИЕЕЕ 754)

  • double за 64‑битни број у покретном зарезу (ИЕЕЕ 754)

<bitfield>

За стварање битског поља. Овај елемент нема поделемената, а може имати следеће атрибуте:

width

Број битова у овом битском пољу. Мора бити између 1 и 64.

type

Тип овог битског поља. Мора бити један од следећих:

  • unsigned за битско поље где вредност треба тумачити као неозначену (опсег 0 до 2width - 1)

  • signed за битско поље где вредност треба тумачити као означену (опсег -2width - 1 до 2width - 1 - 1)

  • bool за битско поље где вредност треба тумачити као логичку

Примедба

Не заборавите да додате испуну после <bitfield>, пошто ће у супротном наредни елемент почети усред бајта (осим код ниски и низова, који аутоматски додају испуну). Наравно, испуна није потребна ако желите ово понашање.

<enum>

За стварање примитивног типа, али где су вредности приказане као чланови набрајања, ако је могуће. Овај елемент нема поделемената (али ће вам требати ознака <enumDef> у фајлу раду упућивања). Има следеће атрибуте:

enum

Подложно набрајање за ову вредност. Мора одговарати атрибуту name једне од ознака <enumDef> у овом фајлу.

type

Тип овог набрајања. Погледајте истоимени атрибут уз <primitive>. Једина разлика је то што овде double и float немају смисла.

<flags>

Исто као и <enum>, само што се вредности представљају као резултат битског или над свим вредностима набрајања.

<struct>

За стварање структуре. Сви други елементи(укључујући и <struct>) могу бити деца овога, и тада ће бити део резултујуће структуре.

<union>

За стварање уније. У суштини исто што и <struct>, осим што ће сви дечји елементи почињати од истог помака. Корисно за тумачење истог низа бајтова на различите начине.

<array>

За стварање низа. Овај елемент прихвата тачно једно дете (подложни тип низа), које може бити било који од елемената, чак и сам <array>. Има следеће атрибуте:

length

Број елемената у овом низу, као декадни број. Алтернативно може бити ниска једнака атрибуту name неког од претходно дефинисаних елемената <primitive>, <enum> или <flags>; тада ће дужина бити вредност тог елемента. Дужина је тренутно ограничена на 10000, јер би већи низови трошили превише меморије и превише успоравали програм.

<string>

За стварање ниске са одређеним кодирањем. Подразумевано се добија ниска окончана нулом, у стилу Ц‑а. За стварање различитих типова ниски могу се употребити следећи атрибути:

terminatedBy

Овај атрибут одређује којом ће се уникодском кодном тачком ниска окончавати. Мора бити хексадекадни број (опционо са водећим 0x); ако је кодирање аски, смислене су само вредности до 0x7f. Ако није задато ни ово ни maxCharCount ни maxByteCount, претпоставља се 0 (ниска Ц стила).

maxCharCount

Највећи број знакова који ниска може да има. Ако је задато и terminatedBy, прво што наиђе окончава ниску. Међусобно искључиво са maxByteCount.

maxByteCount

Колико највише бајтова ниска може бити дугачка. Ако је задато и terminatedBy, прво што наиђе окончава ниску. Међусобно искључиво са maxCharCount. За кодирања попут аскија, ово је исто као maxCharCount.

type

Кодирање ове ниске. Може бити једно од следећих:

  • ASCII

  • LATIN-1

  • UTF-8

  • UTF-16-LE или UTF-16-BE. Ако се не зада ни суфикс -LE ни -BE, претпоставља се мала крајност.

  • UTF-32-LE или UTF-32-BE. Ако се не зада ни суфикс -LE ни -BE, претпоставља се мала крајност.

Сваки елемент такође прихвата атрибут name, који се после види у приказу структура.

Пример исте структуре у ИксМЛ‑у и јаваскрипту

Примедба

Новији, али још недовршени, водич за писање дефиниција структура може се наћи на викију Корисничке базе КДЕ‑а.

Заједнички кораци за оба приступа

Наш фајл са метаподацима изгледа овако:

        [Desktop Entry]
        Encoding=UTF-8
        Icon=arrow-up❶
        Type=Service
        ServiceTypes=KPluginInfo

        Name=Simple test structure
        Comment=A very simple test structure containing only two items

        X-KDE-PluginInfo-Author=Pera Peric
        X-KDE-PluginInfo-Email=pera.peric@nikadodjija.org
        X-KDE-PluginInfo-Name=simplestruct
        X-KDE-PluginInfo-Version=1.0
        X-KDE-PluginInfo-Website=http://www.nikadodjija.org/plugins/
        X-KDE-PluginInfo-Category=structure
        X-KDE-PluginInfo-License=LGPL
        X-KDE-PluginInfo-EnabledByDefault=false
        

Иконица коју Октета приказује за ову структуру може бити нека коју проналази kdialog --geticon, или путања до иконице.

Сва поља би требало да су прилично очигледна, осим X-KDE-PluginInfo-Name. Вредност овог поља мора бити једнака имену фасцикле која садржи фајл, као и имену .desktop фајла. Ако се прави ИксМЛ дефиниција структуре, и име .osd фајла мора бити једнако овоме.

У овом примеру имали бисмо фасциклу по имену simplestruct, која садржи фајл simplestruct.desktop. Ако се структура дефинише ИксМЛ‑ом, фасцикла би такође садржала фајл simplestruct.osd. Ако бисмо користили јаваскрипт, фајл дефиниције би се уместо тога звао main.js.

Једноставна ИксМЛ дефиниција структуре

За почетак дефинишимо врло једноставну пробну структуру која садржи само интегралне типове података (један знак, један 32‑битни означени цео број и једно битско поље). У Ц‑у или Ц++у ово би се изразило као:

          struct simple {
            char aChar;
            int anInt;
            bool bitFlag :1;
            unsigned padding :7;
          };
          

Први корак је писање .osd фајла, формата дефинисаног у претходном одељку. Назваћемо га simplestruct.osd:


          <?xml version="1.0" encoding="UTF-8"?>
          <data>
            <struct name="simple">
              <primitive name="aChar" type="Char"/>
              <primitive name="anInt" type="Int32"/>
              <bitfield name="bitFlag" type="bool" width="1"/>
              <bitfield name="padding" type="unsigned" width="7"/>
            </struct>
          </data>
          

Ово је сасвим слично дефиницији у Ц‑у и Ц++у

Направите фасциклу simplestruct унутар инсталационе фасцикле структура (погледајте одељак о ручном инсталирању дефиниција) и копирајте у њу ова два фајла. Сада можете поново покренути Октету и користити нову структуру.

Једноставна структура у јаваскрипту

Да бисмо извели исту структуру помоћу јаваскрипта, направимо фајл по имену main.js (уместо претходног simplestruct.osd) и променимо X-KDE-PluginInfo-Category=structure у X-KDE-PluginInfo-Category=structure/js. Фајл треба да има следећи садржај:

        function init() {
          var structure = struct({
            aChar : char(),
            anInt : int32(),
            bitFlag : bitfield("bool", 1),
            padding : bitfield("unsigned", 7),
          })
          return structure;
        }
        

Структура коју приказује Октета увек је повратна вредност функције init.

Следеће функције се могу позивати ради стварања примитивних типова:

  • char()

  • int8(), int16(), int32(), int64()

  • uint8(), uint16(), uint32(), uint64()

  • bool8(), bool16(), bool32(), bool64()

  • float()

  • double()

Функција bitfield узима два аргумента. Први је ниска "bool", "signed" или "unsigned". Други аргумент је цео број којим се задаје ширина у битовима.

Сложеније структуре

Прелазимо на дефинисање сложеније структуре, коју ћемо назвати complex и сачувати у фајл по имену complex.osd. Ова структура ће садржати два низа (један фиксне дужине а други коме се дужина одређује при извршавању), као и угнежђену структуру и унију.


          <?xml version="1.0" encoding="UTF-8"?>
          <data>
            <struct name="complex">
              <primitive name="size" type="UInt8" />
              <union name="aUnion">
                <array name="fourBytes" length="4">
                  <primitive type="Int8" />
                </array>
              </union>
              <struct name="nested">
                <array name="string" length="size"> <!-- references the field size above -->
                  <primitive type="Char" />
                </array>
              </struct>
            </struct>
          </data>
          

Ово би одговарало следећем у псеудо‑Ц‑у/Ц++у:

struct complex {
            uint8_t size;
            union aUnion {
              int8_t fourBytes[4];
            };
            struct nested {
              char string[size]; // није правилан Ц++, упућује на вредност uint8 size
            };
          };
          

Примедба

Очигледно само низови динамичке дужине могу упућивати на поља пре низа.

Затим правимо фајл complex.desktop као у претходном примеру (не заборавите да исправно задате X-KDE-PluginInfo-Name) и на исти начин инсталирамо оба фајла.

Још информација

Неколико примера дефиниција структура може се наћи гит ризници. Међу њима су, на пример, дефиниције заглавље ПНГ и ЕЛФ фајлова. ИксМЛ шема која описује структуру .osd фајла такође се налази у ризници. За још информација можете писати на .