Qt socket传送自定义结构体数据

简介

在Socket中,数据一般是char型(一般情况下,其实最好是用uchar来传输,避免莫名其妙的错误,但用char也是可以的),而在Qt里面可以使用QByteArray,这个在QSocket里面,是一个神器,根据C++中char*数据与结构体之间的映射,可以实现结构体与QByteArray的转化!

在Qt的界面中,用QLineEdit对象负责显示发送和接收的文本,对其中的数据进行读取和显示使用的数据类型都是QString;但是,在进行读写时,数据使用的形式都是char数组。

简单定义一个结构体如下,

struct Person
{
    char name[128];
    int age;
};

1.发送端

将界面上的textEdit中的文本传给结构体对象mPerson,并将该结构体发送。

void MainWindow::on_pushButton_Send_Struct_clicked()
{
    char *ptr = ui->textEdit_Send_Name->toPlainText().toLatin1().data();
    memcpy(mPerson.name, ptr, 128);
    mPerson.age = ui->textEdit_Send_Age->toPlainText().toInt();

    QByteArray myByteArray;
    myByteArray.append(reinterpret_cast<char*>(&mPerson), sizeof (mPerson));
    socket->write(myByteArray.data(), sizeof(mPerson));
    socket->flush();
    qDebug() << "write to struct to server......";
}

代码解释:

toPlainText()返回QString,
toLatin1()是将QString转为QByteArray,
data()是将QByteArray转为指向char类型的指针,
memcpy是通用的数据拷贝函数,将数据从一个地方拷贝到另一个地方。

reinterpret_cast运算符是C++用来处理无关类型之间的转换;
reinterpret,即“重新解释”,顾名思义,这个强制类型转换的作用是提供某个变量在底层数据上的重新解释。当我们对一个变量使用reinterpretcast后,编译器将无视任何不合理行为,强行将被转换变量的内存数据重解释为某个新的类型。需要注意的是,reinterpretcast要求转换前后的类型所占用内存大小一致,否则将引发编译时错误。

2.接收端

void MainWindow::socket_Read_Data()
{
    QByteArray buffer;
    buffer = socket->readAll();
    if (!buffer.isEmpty()) {
        Person * p = reinterpret_cast<Person *>(buffer.data());
        qDebug() << "read from client......" << p->name << "  " << p->age;
        ui->textEdit_Recv->setText(QString(p->name) + " " + QString::number(p->age));
    }
}

代码解释:

data()是将QByteArray转为指向char类型的指针,
然后转换成Person类型的指针。
QString()构造函数可以把char[]转为QString,
QString::number类公有函数把int转为QString。

参考:https://blog.csdn.net/qq78442761/article/details/85623507

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章