簡介
在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