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

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