На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Разбор пакета данных по типам , Буфер преобразовать в таблицу
    Уважаемые подскажите пожалуйста,

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

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

    подскажите пожалуйста какие существуют алгоритмы чтобы быстро можно было распарсить буфер в типизированный набор данных
      Протокол/описание структуры буфера имеется?
        Цитата MBo @
        Протокол/описание структуры буфера имеется?

        да есть

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

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

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

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

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

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

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

        Добавлено
        n - кол-во строк
        pRecSize - размер строки в байтах
          Это описание пока не годится. Можно попробовать на пальцах. Вот есть массив байтов (b[0], b[1], b[2], b[3], b[4],...).
          Какая информация содержится в каждом байте, и как на это ложится STRUCTURA ?

          P.S. Это имеет отношение к разбору данных из темы Функция из DLL ?
          Сообщение отредактировано: MBo -
            Цитата 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 я заметил что у них там что то другое помоему
              Уважаемые форумчане , вопрос еще актуален и если у кого есть мысли поделитесь пожалуйста ,
              или возможно кто то знает уже стандартные алгоритмы разбора "байтового результата в ответ на SQL-запрос"
                Цитата kms @
                решение в лоб мы как бы там написали через два цикла и switch ,

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


                Там у тебя не "в лоб" решение, а вполне нормальное.
                Дальше нужно определится, в каком виде тебе нужно хранить полученные значения столбцов. Тут можно сделать либо класс, типа std::variant, либо тупо хранить их в строках, std::string, что для тебя по-моему предпочтительнее.
                  Я так понимаю, есть буфер, типичная куча байтов., если быть точным - одна структура или несколько структур, сложенных по порядку. Разница лишь в том, что каждый раз структуры в буфере разные, и количество их так же меняется. Верно?
                  Но раз мы знаем что ждем, или по заголовку узнаем что пришло, то почему данные просто не представить как ожидаемую структуру?

                  ExpandedWrap disabled
                    // Допустим, был буфер.
                    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 использовать, дабы одну кучу байт одновременно видеть по разному (разными структурами).
                  Ну и конечно же, обязательно надо следить за выравниванием структур, в таком случае.
                    Цитата simsergey @
                    Я так понимаю, есть буфер, типичная куча байтов., если быть точным - одна структура или несколько структур, сложенных по порядку. Разница лишь в том, что каждый раз структуры в буфере разные, и количество их так же меняется. Верно?

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

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

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

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

                    вот как раз это и проблема,
                    немного на сколько хватило ума посматриваю на исходники PostgreSQL , ClickHouse , MySQL
                    но пока не могу уловить как у них сделано
                      Цитата kms @
                      перед разбором буфера прилетает структура описывающая каждый столбец результата,

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

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

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

                            да известен

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

                            нет они без шифрования
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,1162 ]   [ 15 queries used ]   [ Generated: 19.04.24, 07:22 GMT ]