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