我将一个整数转换为QVariant一个对象QByteArray,以便这个数字有一个字节表示。
我愿意:
#include <QDebug>
#include <QByteArray>
#include <QDataStream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "size of int:" << sizeof(int);
QVariant var((int)0xF123);
QByteArray data(sizeof(int),(char)0);
qDebug() << "data before all:" << data.toHex();
QDataStream ds(&data,QIODevice::WriteOnly);
ds << var;
qDebug() << "size of data:" << data.size();
qDebug() << "var to binary byte array:" << data./*right(4).*/toHex();
return 0;
}
在输出我得到:
size of int: 4
data before all: "00000000"
size of data: 9
var to binary byte array: "00000002000000f123"
九个字节而不是四个字节是从哪里来的?
当然,您可以在将类型var发送到 之前显式转换类型QDataStream,如下所示:
ds << var.toInt();
但是在一个真正的程序中,我事先并不知道 in 的类型QVariant,并且我不想switch通过枚举所有可能的数字typeId变量var来做到这一点,而是优雅地做到这一点。
本质上,任务归结为从对象中获取原始数据QVariant及其大小(实际上,大小可以通过 获得typeId,但是你需要用一个长开关检查,值QVariant::type(),此外,要考虑到QMetaType::Int不同的环境它可以有不同的大小,你还必须比较sizeof(int)
PS我发现了一个关于该主题的有趣页面: https ://bugreports.qt.io/browse/QTBUG-35510?page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel&showAll=true
QDataStream有自己的数据格式,接近数字的硬件表示,但又有所不同。如果您QByteArray通过写入QDataStream,则需要通读它(通过 的另一个实例QDataStream)。并且不清楚为什么将 0 放在数组的开头 - 这显然不合适,您不应该将 data 与 data 混合QDataStream。它应该是这样的:
如果您想使用“原始”数据 - 不要使用
QDataStream受到@Ariox 评论的启发(我借此机会表示感谢,谢谢)和以下信件,我找到了这样一个犹太/非犹太(强调必要的)解决方案:
修改后的示例如下所示:
也就是说,我使用了一个未记录但开源的
QVariant::constData.QByteArray不需要“犹太洁食”(但不正确)的用法。事实证明, in 中的类型的大小QVariant很容易通过QMetaType::sizeOf恕我直言
QVariant::constData,尽管担心它的“不安全性”,但它应该被留下并记录在案,因为 C++ 语言本身实际上是不安全的,它允许你在脚下射击并将很多责任放在程序员自己身上,为什么剥夺程序员的所有机会QVariant,否则某些任务没有解决?PS也许将来他们会打开并
QVariant::convert(const int t, void ptr) const记录QVariant::constData