#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QHash>#include <QString>#include <QDebug>#include "taggeddata.h"struct str1{ int k; short y; char g;};struct str2{ int k; short y; char g;};struct str3{ int k; short y; char g;};namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{ Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); QHash<QString, taggeddata*> hash; str1 ST1; str2 ST2; str3 ST3;private: Ui::MainWindow *ui; void AddToList(char* ID, int size, void *exdata, int flags); void getHashData(char* ID);};#endif // MAINWINDOW_H
#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); AddToList("st1", sizeof(ST1), &ST1, IS_READABLE); AddToList("st2", sizeof(ST2), &ST2, IS_WRITABLE); AddToList("st3", sizeof(ST3), &ST3, IS_READABLE); AddToList("st4", sizeof(ST1), &ST1, IS_READABLE); ST3.k=5; ST3.y=9; ST3.g=1; sleep(5); getHashData("st3");}MainWindow::~MainWindow(){ delete ui;}void MainWindow::AddToList(char* ID, int size, void *exdata, int flags){ hash[ID]=new taggeddata(ID, size, exdata, flags);}void MainWindow::getHashData(char* ID){ QHashIterator<QString, taggeddata *> i(hash); while (i.hasNext()) { i.next(); qDebug()<<"current data"<<i.value()->get_ID()<<i.value()->get_exdata()<<i.value()->get_flags(); if(strcmp(ID,i.value()->get_ID())==0) { qDebug()<<"FINED DATA+++++++++++++++++++++++"<<ID<<i.value()->get_exdata()<<i.value()->get_size(); break; } } QByteArray ttt; ttt.clear(); memcpy(i.value()->get_exdata(), ttt, i.value()->get_size()); qDebug()<<ttt.size();// результат 0 !!!!!!// формируем QByteArray// QByteArray sendArr;// sendArr.clear();// qint16 count_st=2;// sendArr.append(count_st);// qDebug()<<sendArr.size();// sendArr.append(ID,16);// qDebug()<<sendArr.size()<<sendArr; // sendArr.append(ID,);}
#ifndef TAGGEDDATA_H#define TAGGEDDATA_H#include <QMutex>#define IS_READABLE 1#define IS_WRITABLE 2class taggeddata{public: taggeddata(char* ID, int size, void *exdata, int flags); inline QMutex *get_mutex(){return &_mutex;}; inline void *get_exdata(){return _exdata;}; inline int get_size(){return _size;}; inline char* get_ID(){return _ID;}; inline int get_flags(){return _flags;};private: QMutex _mutex; int _flags; void *_exdata; int _size; char* _ID;};#endif//TAGGEDDATA_H
include "taggeddata.h"taggeddata::taggeddata(char* ID, int size, void *exdata, int flags) :_flags(flags), _exdata(exdata), _size(size), _ID(ID){}
C++ (Qt)taggeddata * data = hash.value("st3");if (data) { ...}
auto it = hash.find("st3");if (it != hash.end()) { it.value()...}
char *dat=(char*)i.value()->get_extdata();int count=0;while(count<i.value()->get_size()){qDebug()<<*dat;++dat;count++;}
QByteArray send;send.resize(i.value()->get_size());memcpy(send.data(),(char*)i.value()->get_exdata(),i.value()->get_size());qDebug()<<send;// размер верный send 8 байт, но данные толь первый байт есть, дальше пусто
[quote author=Firefox link=topic=33056.msg244956#msg244956 date=1624626370]Как ещё можно заменить получение данных побайтрво.