- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在 Qt 中编写一个简单的基于 TCP 的网络应用程序并想使用 QDataStream
和 QByteArray
通过网络发送数据。问题是当我将数据放入 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/
我有一个相当奇怪的问题,使用 QDataStream,或者至少对我来说很奇怪,因为我根本不理解这种行为。 当然,我的问题来自一个大项目,但我设法用一个最小的例子重现了这种奇怪的行为,我现在将对此进行描
QFile msnLogFile(item->data(Qt::UserRole).toString()); QDataStream logDataStream; if(msnLogFile
我有一个包含两个主要模块的应用程序。一个是用 C 编写的,使用标准 C 运行时库,另一个是用 Qt C++ 编写的。它们通过 IPC 相互通信。 C 模块创建一个 char 数组,用数据填充它并发送到
我正在努力学习教程 here并序列化 Qt 对象。这是我的代码: QFile file("/Users/kaustav/Desktop/boo.dat"); if (!file.open(QIODev
我想将 QVector 序列化为 char* 数组。我通过以下代码执行此操作: QVector in; ... QByteArray bytes; QDataStream stream(&bytes,
我正在尝试保存 3 QVector和一个带有 QDataStream 的整数. 我重载了 operator #include #include class CloudData { public:
我正在尝试将特征向量序列化为 QDataStream: #include "utils.h" #include "Eigen/Eigen" int main(int argc, char *argv[
我正在用 Qt 实现一个小接口(interface)。在我目前正在处理的步骤中,我有 Scores(自定义类)我可以在只能容纳一个 Score 的 Docks(同样是自定义类)上移动。 我用这个例子启
假设我有一个创建 QIODevice(例如 QFile)的函数,然后返回一个指向从 QIODevice 构造的 QDataStream 的指针。在这里处理内存分配的最佳方法是什么?显然,QIODevi
我需要通过 QTcpSocket 接收二进制数据(读取浮点数)并使用 QDatastream 将它们写入 Qfile。但是我在使用 QDataStream 时遇到了一些问题。如下,我只能用这种方式来实
请考虑以下来自 QDataStream 的代码片段文档: QFile file("file.dat"); file.open(QIODevice::ReadOnly); QDataStream in(
我目前正在尝试在我的代码中实现一个序列化系统,该系统将一个类型的多个对象存储在一个文件中。这非常有效,我通常只是使用 OpenMode QIODevice::Append 将它们一一附加。这里没有问题
我想将存储在 vector (保存结构)中的数据写入文件,并从该文件读取数据。我尝试使用 QDataStream 并重载“>>”和“ &data) { for(uint8_t i=0; i >
我想为抽象类重载 class AbstractBaseClass { public: AbstractBaseClass(); int BaseFirstField() const;
我正在尝试在 QTcpSocket 上发送一个 QByteArray 。我面临的问题是,虽然我发送了一个长度为 25 的数组,但在服务器上它收到了 59 个字节。这是我的示例代码: //client
这是一个关于在 C++ 和 Linux 中使用 QDataStream 和 QTemporaryFile 的 QT 问题。 我在刷新 QDataStream 时遇到了一些问题。 QTextStream
我正在 Qt 中编写一个简单的基于 TCP 的网络应用程序并想使用 QDataStream和 QByteArray通过网络发送数据。问题是当我将数据放入 QByteArray 时他们被“归零”了。例如
我有来自 tcp 套接字的数据作为原始数据(我有指定的格式),然后基于该数据创建一个对象。格式是这样的:24 字节的 header [数据大小和一些其他信息],然后是 header 中指定的数据量。
我有一个文件,假设长度为 8 个字节。例如它看起来像这样: 22222222 现在,我先读取 5 个字节并更改它们。对于前。到 11111 最后,我想将它们写入 ONTO EXCISTING DATA
根据本网站上的各种答案,我尝试定义自己的模板函数以将任何枚举值写入 QDataStream。 template ::value>> QDataStream &operator>(enumValue);
我是一名优秀的程序员,十分优秀!