LINUX.ORG.RU

Какой конфиг умеет описывать именованные битовые поля?

 


1

2

В приступе NIH синдрома прорабатываю конфигурационный формат. Нужны строки,массивы(в пределах 1 типа),целые и вещественные числа и барабанная дробь - битовые поля. Всякие json,toml,yaml,libconfig в топку. Для меня слишком имбовые да и не поддерживают нужных мне микрофичь типа использования нескольких типов разделителей для массивов для визуального разделения данных типа array[1,2,3:4,5,6], тегирования ключей и секций для фильтров и прочего прочего. Но вот сейчас пью чай и подумалось. Наверное есть какой-то формат который умеет в битовые поля?

Так что бы по итогу: ну вы поняли.

typedef struct
{  uint8_t a1:1;
   uint8_t a2:1;
   uint8_t a3:1;
   uint8_t a4:1;
   uint8_t a5:2;
   uint8_t a6:2;
   uint8_t a7:1;
}value value;

if(config_tablebit_size(cfg,"table.bits") <= sizeof(value))
{
   value = config_tablebit_get(cfg,"table.bits");
}
// ну или одхренственно
uint16_t value2 = 0;
if(config_tablebit_size(cfg,"table.bits") <= sizeof(value2))
{
   value = config_tablebit_get(cfg,"table.bits");
}

Просто интересно стало =) Как в таких конфигах описываются поля, мне не интересно. Мне интересно есть ли такие. И что важно, те конфиги которые на каждый бит для внутреннего представления тратят целый тип минимально нужного размера то есть на битовое поле из 8 бит тратят 8 байт -> нинада =)

UDP: Третья кружка чая допита. Чёт уже не интересно стало :D

★★★★★

Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)

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

Иногда удобнее вместо целой маски 0xf или 0b0101 указать явно бит по имени, в этом случае отдельный бит можно рассматривать либо как булево значение либо если единица битового поля больше чем 1 например 1 байтовое поле с двумя элементами по 4 бита то можно использовать как булевый массив. Но по итогу во внутреннем представлении конфига это всего лишь int8_t. Ну и заполнять структуры где и обычные значения и битовые маски вместе. А битовые поля как булевы значения (не только как маски) я стал использовать часто и это удобно.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от fornlr

Я тащить вообще ничего не собираюсь, я себе сам напишу =)

LINUX-ORG-RU ★★★★★
() автор топика

В андройдовом xml вроде что-то есть такое

mittorn ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

реальная упаковка в биты в битовых полях - implementation defined. для переносимого кода не рекомендованы.

{  uint8_t a1:1;
   uint8_t a2:1;
   uint8_t a3:1;
   uint8_t a4:1;
   uint8_t a5:2;
   uint8_t a6:2;
   uint8_t a7:1;
}value value;

и size такой структуры не вполне ясен.

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

реальная упаковка в биты в битовых полях - implementation defined. для переносимого кода не рекомендованы.

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

и size такой структуры не вполне ясен.

Минимальный набор 8 битных байтов.Тут 9 бит значит 1байт +1 бит. И того 2 байта 16 бит. Даже если будет 4битный байт это будет не важно ибо sizeof() вообще никакого значения не имеет. Вся суть только в том что размер принимающего типа должен быть больше или равен, вот и всё.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от fornlr

Ну бери протобуф и обмазывайся.

Неужели кто-то в здравом уме берёт это и обмазывается?

anonymous
()

Он таки более-менее есть, но про него (почти) все успешно забыли: cgetent.

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

Я в курсе

https://developer.valvesoftware.com/wiki/CS:GO_User_Messages https://github.com/SteamDatabase/Protobufs https://github.com/ValveSoftware/GameNetworkingSockets

Но это ничего не меняет. Протобуфы прикольные, но далеко не всегда нужные в принципе :3 У меня не на все случаи жизни конфигурялка, а чётко вод нужды и не более того.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Чет сдаётся ты путаешь представление и интерфейс. Булево поле в конфиге есть булево поле, отвечает оно за выставление бита или стирание вселенной - это уже вопросы реализации.

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

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)

Не понимаю зачем тебе именно битовые поля в конфиге. Ну опиши строкой «0b010101010» и все. Тебе ж чем проще парсер тем лучше, а ты изощряешься.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.