gpt4 book ai didi

c++ - QDataStream 将错误值写入 QByteArray

转载 作者:太空宇宙 更新时间:2023-11-04 12:41:33 26 4
gpt4 key购买 nike

我正在 Qt 中编写一个简单的基于 TCP 的网络应用程序并想使用 QDataStreamQByteArray通过网络发送数据。问题是当我将数据放入 QByteArray 时他们被“归零”了。例如(连接到定时器超时信号的 MainWindow 中的一个槽):

void MainWindow::SendPlayer1Data(){
QByteArray block;
QDataStream s(&block, QIODevice::OpenModeFlag::ReadWrite);
QString h="hello";
s<<h;
qDebug() << "h: " << data;
qDebug() << "block: " << QString(block); // equivalent to s >> h on receiving end
qDebug() << "block[0]: " << int(block[0]);
}

h:         "hello"
block: ""
block[0]: 0

我收到 "hello"一开始有一次,但之后我只得到 "" . qint32也是如此.客户端和服务器都显示 QByteArray大小是 14 个字节,所以 QDataStream将数据写入该数组,但它使它们成为 0 (它显示 "" 当我使用 s >> h 然后使用 qDebug() << h )

最佳答案

这里的问题是将 QString 直接写入需要 QByteArray 的流,请考虑以下内容

QByteArray block;
QDataStream s(&block, QIODevice::OpenModeFlag::ReadWrite);
QString h = "hello";
s << h;
qDebug() << block;

哪些输出

"\x00\x00\x00\n\x00h\x00""e\x00l\x00l\x00o"

所以数据就在那里,只是不像人们所期望的那样。解决此问题的最简单方法是从使用 UTF8(或您选择的其他编码)编码的字符串创建一个 QByteArray。这可以轻松地即时完成,

QByteArray block;
QDataStream s(&block, QIODevice::OpenModeFlag::ReadWrite);
QString h = "hello";
QByteArray data(h.toUtf8(), 5);
s << data;
qDebug() << block;

哪些输出

"\x00\x00\x00\x05hello"

因为当此 QByteArray 通过 QDataStream 发送时,数组的长度和 3 个 NULL 字符被前置 - NULL 字符在那里,以防缓冲区大于相对较小的 5(您可以通过传递一个更大的值来为自己测试 - 256 的小系数最能说明问题 - 作为第二个QByteArray 构造函数中的参数,因为这是缓冲区长度)。但是,如果您尝试从 NULL 开始的 QByteArray 中显式构造一个 QString(如 s >> h 所做的那样) > 它将创建一个空字符串。要纠正这个问题,您可以使用 QByteArray::remove() 像这样删除第一个 4 字节

QByteArray block;
QDataStream s(&block, QIODevice::OpenModeFlag::ReadWrite);
QString h = "hello";
QByteArray data(h.toUtf8());
s << data;
qDebug() << QString::fromUtf8(block.remove(0, 4));

哪些输出

"hello"

完整示例

#include <qbytearray.h>
#include <qdatastream.h>
#include <qdebug.h>

int main() {
QByteArray block;
QDataStream s(&block, QIODevice::OpenModeFlag::ReadWrite);
QString h = "hello";
QByteArray data(h.toUtf8());
s << data;
qDebug() << QString::fromUtf8(block.remove(0, 4));
}

关于c++ - QDataStream 将错误值写入 QByteArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53966718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com