i
ingenflyҚар. 5, 2019, 9:52 Т.Ж.

Парсинг бинарного файла.

Прошу заранее простить за глупые вопросы. Язык только начал изучать и для меня это хобби-поэтому буду благодарен любому совету. Проблема такова:
Имеется бинарный файл, рядом с ним лежит.ini файл, в котором описана структура пакетов (фреймов) двоичного файла. Описание каждого параметра бинарного файла занимает 7 полей в .ini файле .
Проблема в том, что количество и тип параметров в .ini файле заранее не известен. Обычно это около 100 параметров. И тогда эти 100 параметров образуют, как я это понимаю, в бинарном файле непрерывную область - пакет(фрейм).
Пакеты пишутся в файл с частотой 1 раз в сек. Продолжительность - 2 суток - далее создается новый файл. Т.е. для каждого файла мы получаем где-то 2,5млн. отсчетов каждого параметра.
На основании ini файла я создал модель, которую вывел на табличное представлене. Необходимо, при выборе определенного параметра в представлении построить график по данным выбранного параметра. А из-за того что количество и тип параметров в пакете разное из-за недостатка знаний не могу понять как и куда их считывать и как правильно приводить к типу.

К примеру 1 параметр имеет имя MKS и тип Int8. Как мне создать контейнер, к который запихнуть 2,5 млн. отсчетов данного параметра и по ним построить график?

// Пример .ini файла
[CONST]
RegVer=3.1
DATA=03/11/19
Nomer=402
CharSet=Win

[ITEMS]
Count=87

ParamType1=Int8
ParamName1=MKS
ParamDispName1=Наличие связи
ParamKoef1=1,000000
ParamMax1=32,000000
ParamEdIzm1=
ParamFlags1=0

ParamType2=uInt16
ParamName2=Regim
ParamDispName2=Режим работы
ParamKoef2=1,000000
ParamMax2=65535,000000
ParamEdIzm2=
ParamFlags2=1


ParamType3=uInt8
ParamName3=I1
ParamDispName3=Ток 1-го двигателя
ParamKoef3=10,000000
ParamMax3=1400,000000
ParamEdIzm3=А
ParamFlags3=1

ParamType4=uInt8
ParamName4=I2
ParamDispName4=Ток 1-го двигателя
ParamKoef4=10,000000
ParamMax4=1400,000000
ParamEdIzm4=А
ParamFlags4=1
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

6
Ruslan Polupan
  • Қар. 5, 2019, 12:22 Т.Қ.

Добрый день. А почему бы не писать данные в базу данных, например SQLite?

    Evgenii Legotckoi
    • Қар. 5, 2019, 1:52 Т.Қ.

    Используйте базу данных SQLite. Организация разнородных данных в одном файле - это будет тот ещё геморрой.

    Можете начать изучение с этой статьи по SQLite и таблицам

      i
      • Қар. 5, 2019, 2:11 Т.Қ.

      Проблема в том, что эта структура уже реализована промышленно. Я никак не могу повлиять на ее измениние. Мне же хочется добавить автоматическую диагностику параметров по определенным критериям.
      Но для начала нужно придумать как эту структуру считать (
      Далее да. Логично писать в базу данных. Из базы делать выборку и строить график за выбранный период.
      Но для начала надо написать парсер для этого файла.
      Есть хоть какие-то идею в каком направлении двигаться?

        R
        • Қар. 5, 2019, 3:38 Т.Қ.
        • (өңделген)

        Добрий день, не до кіцня зрозумів для чого таке може бути
        але справді можите використовувати SQLite, ну або вже якщо дуже хочеться іменно в файл писати json, xml

        так парсер по перехочу рядка рахуйте тоді я так розумію що контейнери завжди йдуть через два пустих рядка

          i
          • Қар. 6, 2019, 6:38 Т.Ж.

          Извините. Все равно не могу понять. Мне нужно файл прочитать, а не писать. Я не создаю его.
          Вот допустип я каждый параметр прочитал и записал в базу. Но когда читаю с базы мне эти абстрактные данные нужно привести к типу, .toInt() к примеру, запихать в массив интов и построить график. И я по прежнему не могу понять как в данном случае определиться к какому типу я должеть приводить.

            R
            • Қар. 6, 2019, 1:51 Т.Қ.

            я вам просто кину пару речей думаю розберетесь, так читаєм файл по рядках
            тут є багато прикладів http://www.java2s.com/Code/Cpp/Qt/CatalogQt.htm

                QFile file("in.txt");
                if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
                    return 1;
            
                while (!file.atEnd()) {
                    QByteArray line = file.readLine();
                    process_line(line);
                }
            

            далі вам потрібно парсати самі проперті
            початком проперті яб рахував ParamType по ній би робив апенд в список, як приклад нижче (кастильно но.....)))) перше що прийшло в голову )

            void process_line(QString value)
            {
                QStringList p = value.split("=");
            
                if(!p.isEmpty())
                {
                    QString m_name = p.at(0);
            
                    if(m_name.startsWith("ParamType"))
                    {
            
                    }
                    else if(m_name.startsWith("ParamName"))
                    {
                        QString m_Name = p.at(1);
                    }
                    else if(m_name.startsWith("ParamDispName"))
                    {
            
                    }
                    else if(m_name.startsWith("ParamKoef"))
                    {
            
                    }
                    else if(m_name.startsWith("ParamMax"))
                    {
            
                    }
                    else if(m_name.startsWith("ParamEdIzm"))
                    {
            
                    }
                    else if(m_name.startsWith("ParamFlags"))
                    {
                        int m_flag = QVariant(p.at(1)).toInt();
                    }
            
                }
            }
            

              Пікірлер

              Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
              Кіріңіз немесе Тіркеліңіз
              Ua

              Qt - Тест 001. Сигналы и слоты

              • Нәтиже:84ұпай,
              • Бағалау ұпайлары4
              Ua

              Qt - Тест 001. Сигналы и слоты

              • Нәтиже:42ұпай,
              • Бағалау ұпайлары-8
              ОК

              Qt - Тест 001. Сигналы и слоты

              • Нәтиже:47ұпай,
              • Бағалау ұпайлары-6
              Соңғы пікірлер
              ИМ
              Игорь МаксимовҚар. 22, 2024, 9:51 Т.Қ.
              Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
              Evgenii Legotckoi
              Evgenii LegotckoiҚаз. 31, 2024, 11:37 Т.Қ.
              Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
              A
              ALO1ZEҚаз. 19, 2024, 5:19 Т.Қ.
              Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь МаксимовҚаз. 5, 2024, 4:51 Т.Қ.
              Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas5Шілде 5, 2024, 8:02 Т.Қ.
              QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              Енді форумда талқылаңыз
              f
              firstlunoxodАқп. 15, 2025, 1:46 Т.Қ.
              Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
              Дмитрий
              ДмитрийАқп. 3, 2025, 4:24 Т.Қ.
              Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
              NW
              Nayo WaiҚаң. 30, 2025, 7:22 Т.Қ.
              не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
              n
              nklyҚаң. 3, 2025, 12:52 Т.Қ.
              Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
              M
              MarselТам. 17, 2023, 12:26 Т.Ж.
              OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

              Бізді әлеуметтік желілерде бақылаңыз