Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 |
да есть Добавлено это как бы описание Добавлено если описывать словесно то 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 |
да да да , мы делаем там конектор к СУБД HyTech , и вот я пытаюсь хоть разобрать алгоритм и вообще какие существуют методы и способы разбора пачки данных полученного от сервера в ответ на SQL-запрос Добавлено да точно 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-запроса , Добавлено да , точно , перед разбором буфера прилетает структура описывающая каждый столбец результата, точней если не трудно посмотрите http://hytechdb.ru/index.php?s=docs&ru=V25...SqlDstInfoT.htm Добавлено вот как раз это и проблема, немного на сколько хватило ума посматриваю на исходники PostgreSQL , ClickHouse , MySQL но пока не могу уловить как у них сделано |
Автор: KILLER 27.04.17, 08:57 |
Ну если на С++, то сделай фабрику объектов на крайняк. Реализуй базовые типы данных, все. По сути тип столбика важен только тогда, когда нужно редактировать какие то данные в таблице, а для чтения - достаточно чтоб все данные были представлены как строка. |
Автор: kms 30.04.17, 20:02 |
да это точно , и я бы так и сделал , но как тогда делать преобразования в строку |
Автор: 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 |
да известен Добавлено нет они без шифрования |