0

我需要从 QByteArray 构造一个 QVariant 对象。QVariant 构造函数 QVariant(const QByteArray & val) 是否期望 QByteArray 中的原始字节以空值结尾?

背景资料:

我的 QByteArray 对象是用 QByteArray::fromRawData(const char * data, int size) 构造的,并且不是以空值结尾的。

我的目标是使用 QSqlQuery::bindValue() 将 QByteArray 对象中的原始字节复制到数据库中,该数据库期望 Qvariant 对象作为其参数之一。

我的猜测是 QByteArray 中的字节必须以空值结尾。我看不到如何实现 QVariant(const QByteArray & val) 构造函数的任何其他方式。

非常感谢!

4

2 回答 2

0

添加到 QByteArray 中的字节可能会或可能不会以 0 结尾。如果将 QByteArray 转换为 QVariant,它将包含已添加到数组中的所有字节,而不管它们的值如何。这是可能的,因为 QByteArray 存储字节数。当你有char*指针和字节数时,你可以安全地操作字节而不知道那里是否有 0。

实际上,当您调用data()获取char*指针时,数据始终以空值结尾。但它确实在幕后。如果您使用data()该指针并将其传递给某个没有大小的函数,0-终止将保护您免受段错误的影响。但这在您的问题中并不重要。

我将尝试使用示例来说明这一点。

Raw data: 1 2 3 4 ....
calling fromRawData(pointer, 4)
QByteArray contents: 1 2 3 4
Underlying QByteArray's buffer contents: 1 2 3 4 0 ...

Raw data: 1 2 3 0 ....   
calling fromRawData(pointer, 4)
QByteArray contents: 1 2 3 0
Underlying QByteArray's buffer contents: 1 2 3 0 ...

Raw data: 1 0 2 3
calling fromRawData(pointer, 4)
QByteArray contents: 1 0 2 3
Underlying QByteArray's buffer contents: 1 0 2 3 0 ...

QVariant 将包含与“QByteArray 内容”相同的字节。

于 2013-08-09T09:00:12.163 回答
0

为新人编辑。看评论。

来自文档

QByteArray 可用于存储原始字节(包括“\0”)和传统的 8 位“\0”结尾的字符串。使用 QByteArray 比使用 const char * 方便得多。在幕后,它始终确保数据后跟一个 '\0' 终止符

这意味着,即使你不让它为空终止,QByteArray 也会确保它。但只有当它创建一个深拷贝时...检查size()

int QByteArray::size() 常量

返回此字节数组中的字节数。字节数组的最后一个字节在位置 size() - 1。另外,QByteArray 保证 size() 位置的字节始终为 '\0',这样就可以使用 data() 和 constData 的返回值() 作为期望以 '\0' 结尾的字符串的函数的参数。如果 QByteArray 对象是从不包含尾随空终止字符的原始数据创建的,则除非创建深层副本,否则 QByteArray 不会自动添加它。

由于 prolly QVariant 将使用 constData() 方法,您不能确定它将以空值终止。看看这个要点

于 2013-08-08T21:10:30.397 回答