Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Алгоритмы > Разбор пакета данных по типам


Автор: kms 31.03.17, 01:40
Уважаемые подскажите пожалуйста,

имеется некий буфер ( BUFER ) в котором байты

требуется преобразовать этот буфер в таблицу в которой каждая колонка свой тип и длина
(хранится в отдельной STRUCTURA на каждый столбик
т.е STRUCTURA[n].type - тип n-ного столбика
STRUCTURA[n].len - длина n-ного столбика )

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

Автор: MBo 31.03.17, 01:45
Протокол/описание структуры буфера имеется?

Автор: kms 31.03.17, 03:29
Цитата MBo @
Протокол/описание структуры буфера имеется?

да есть

Добавлено
это как бы описание

Добавлено
если описывать словесно то

BUFER - это двухмерный массив байтов

если конкретизировать к Си то это
char *bufOut = new char[РазмерСтроки * Кол-воСтрок]; // Адрес буфера для присылаемых записей.

и имеется структура описывающая эти данные в буфере

в структуре как раз и хранится информация о каждом столбике
STRUCTURA[n].type - тип n-ного столбика
STRUCTURA[n].len - длина n-ного столбика

Добавлено
если в С++ то буфер выглядит так std::vector<char> masResult(n *pRecSize);

Добавлено
n - кол-во строк
pRecSize - размер строки в байтах

Автор: MBo 31.03.17, 05:43
Это описание пока не годится. Можно попробовать на пальцах. Вот есть массив байтов (b[0], b[1], b[2], b[3], b[4],...).
Какая информация содержится в каждом байте, и как на это ложится STRUCTURA ?

P.S. Это имеет отношение к разбору данных из темы Функция из DLL ?

Автор: kms 31.03.17, 06:44
Цитата MBo @
P.S. Это имеет отношение к разбору данных из темы Функция из DLL ?

да да да , мы делаем там конектор к СУБД HyTech , и вот я пытаюсь хоть разобрать алгоритм и вообще какие существуют методы и способы разбора пачки данных полученного от сервера в ответ на SQL-запрос

Добавлено
Цитата MBo @
Вот есть массив байтов (b[0], b[1], b[2], b[3], b[4],...).

да точно

Цитата MBo @
Какая информация содержится в каждом байте, и как на это ложится STRUCTURA ?

STRUCTURA содержит в себе несколько параметров о колонках тип и размер в байтах сколько занимает данная колонка

т.е. получив пачку байтов ( BUFER ) которую надо преобразовать в типизированную таблицу мы уже имеем STRUCTURA и количество строк и столбцов в этом BUFER

остается только этот BUFER преобразовать в таблицу

решение в лоб мы как бы там написали через два цикла и switch ,

но рассматривая исходники ClickHouse я заметил что у них там что то другое помоему

Автор: kms 17.04.17, 01:56
Уважаемые форумчане , вопрос еще актуален и если у кого есть мысли поделитесь пожалуйста ,
или возможно кто то знает уже стандартные алгоритмы разбора "байтового результата в ответ на SQL-запрос"

Автор: Олег М 17.04.17, 06:11
Цитата kms @
решение в лоб мы как бы там написали через два цикла и switch ,

но рассматривая исходники ClickHouse я заметил что у них там что то другое помоему


Там у тебя не "в лоб" решение, а вполне нормальное.
Дальше нужно определится, в каком виде тебе нужно хранить полученные значения столбцов. Тут можно сделать либо класс, типа std::variant, либо тупо хранить их в строках, std::string, что для тебя по-моему предпочтительнее.

Автор: simsergey 18.04.17, 18:08
Я так понимаю, есть буфер, типичная куча байтов., если быть точным - одна структура или несколько структур, сложенных по порядку. Разница лишь в том, что каждый раз структуры в буфере разные, и количество их так же меняется. Верно?
Но раз мы знаем что ждем, или по заголовку узнаем что пришло, то почему данные просто не представить как ожидаемую структуру?

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    // Допустим, был буфер.
    char* buf;
     
    // Допустим, известно, что в нем может быть две структуры
    struct DataOne {
     int i;
     float f;
    }
     
    struct DataTwo {
     float f1;
     float f2;
     char stamp[4];
    }
     
    // Мы знаем, что в буфере лежит структура DataTwo
    // и просим компилятор представить буфер как структуру DataTwo
    float f1 = ((DataTwo*)buf)->f1;
     
    // И самое интересное, нам нужно получить доступ именно к пятой по порядку лежащей структуре
    DataTwo* pDTW;
    pDTW = (DataTwo*)buf;
    float f2 = pDTW[4]->f2;

Как-то так, ну а дальше все зависит от фантазии.
Можно еще union использовать, дабы одну кучу байт одновременно видеть по разному (разными структурами).
Ну и конечно же, обязательно надо следить за выравниванием структур, в таком случае.

Автор: kms 26.04.17, 20:31
Цитата simsergey @
Я так понимаю, есть буфер, типичная куча байтов., если быть точным - одна структура или несколько структур, сложенных по порядку. Разница лишь в том, что каждый раз структуры в буфере разные, и количество их так же меняется. Верно?

да точно , это же результат sql-запроса ,

Добавлено
Цитата simsergey @
Но раз мы знаем что ждем, или по заголовку узнаем что пришло,

да , точно , перед разбором буфера прилетает структура описывающая каждый столбец результата, точней если не трудно посмотрите http://hytechdb.ru/index.php?s=docs&ru=V25...SqlDstInfoT.htm

Добавлено
Цитата simsergey @
то почему данные просто не представить как ожидаемую структуру?

вот как раз это и проблема,
немного на сколько хватило ума посматриваю на исходники PostgreSQL , ClickHouse , MySQL
но пока не могу уловить как у них сделано

Автор: KILLER 27.04.17, 08:57
Цитата kms @
перед разбором буфера прилетает структура описывающая каждый столбец результата,

Ну если на С++, то сделай фабрику объектов на крайняк. Реализуй базовые типы данных, все. По сути тип столбика важен только тогда, когда нужно редактировать какие то данные в таблице, а для чтения - достаточно чтоб все данные были представлены как строка.

Автор: kms 30.04.17, 20:02
Цитата KILLER @
а для чтения - достаточно чтоб все данные были представлены как строка.

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

Автор: simsergey 01.05.17, 05:52
Цитата kms @
точней если не трудно посмотрите http://hytechdb.ru/index.php?s=docs&ru=V25...SqlDstInfoT.htm
Было время, было не трудно, глянул.
Там описывают структуру. Алгоритмов по разбору ответа sql сервера я там не заметил.

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

Автор: kms 01.05.17, 07:41
Цитата simsergey @
Порядок данных в буфере известен?

да известен

Добавлено
Цитата simsergey @
, если данные не зашифрованы (не запакованы),

нет они без шифрования

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)