LINUX.ORG.RU

Код для чтения хитрых полей

 , , ,


0

1

По сети приходит пакет из 8 байтов. Есть описание, где указано что в этих байтах лежит. Для какждого поля указывается размер в битах (от 1-го бита до 64-х). Стартовый бит с которого это поле начинается. Знаковое или беззнаковое. Порядок байтов внутри этого поля (LSB/MSB). Нужно сгенерить код для разбора таких пакетов. Были бы все поля в формате интела, сделал бы структуру с битовыми полями и вперед. Но мотороловский формат все портит. Есть идея ради него просто поментяь местами байты.

Или есть более красивый способ?

★★★

man ntohs и иже с ним. Сначала преобразуй в хост-порядок, потом тупо структурой разбирай.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Он не годится, например для поля из пяти бит. Вот предположим в структуре идут два поля из 5 бит. Одно занимает 5 младших бит 0-го байта. Второе разбито на две части. 3 бита лежат в 0-м байте, а 2 бита в 1-м байте. В зависомости от LSB или MSB часть в 0-м бите может быть как младшей, как и старшей.

vromanov ★★★
() автор топика

Или есть более красивый способ?

Нет.

mix_mix ★★★★★
()

Нет, конечно. Другое дело, что можно сделать ради этого функцию с форматной строкой или даже транслятор DSL.

tailgunner ★★★★★
()
Ответ на: комментарий от vromanov

Еще раз: если ты передаешь в "сетевом порядке", то используя преобразование в порядок хоста, ты избавляешься от всех этих проблем!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Это все хорошо рабоатет для uint16, uint32. А для смеси из полей с разными смещениями и порядком не очень

vromanov ★★★
() автор топика
Ответ на: комментарий от vromanov

А для смеси из полей с разными смещениями и порядком не очень

смещение от начала пакета должно быть, а не от формы представления в очередной архитектуре

anonymous
()
Ответ на: комментарий от vromanov

Тогда принимай бинарные данные побайтово и обрабатывай согласно протоколу, вручную копируя байт в нужное место структуры.

Eddy_Em ☆☆☆☆☆
()

пакет из 8 байтов

Это же uint64_t? В чем подвох? Маска/сдвиг/крутим байты/обрабатываем знак, не?

anonymous
()
Ответ на: комментарий от vromanov

Это не я придумываю. Это так присылают

Или есть более красивый способ?

межархитектурный вариант в любом случае с одной из сторон будет ужасен

anonymous
()
Ответ на: комментарий от anonymous

Короче, заведу структуру с битовыми полями и просто поменяю байты местами.

vromanov ★★★
() автор топика
Ответ на: комментарий от vromanov

ASN.1

ASN.1 (англ. Abstract Syntax Notation One) — в области телекоммуникаций и компьютерных сетей язык для описания абстрактного синтаксиса данных (ASN.1), используемый OSI.

лучше пример попроси

anonymous
()

для хитрых архитектур и хитрых полей существуют ассемблерные инструкции изменения порядка бит и байт, можно в эту сторону посмотреть

anonymous
()
Ответ на: комментарий от vromanov

В чём проблема? Во первых, как уже сказали, ntohl. А дальше как-то так:

union {
    uint64_t input_buffer;
    struct {
         uint fisrt_field  :3;
         uint second_field :5;
         /* ... */
    } parsed_fields;
};
beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.