我需要从QByteArray构造一个QVariant对象。 QVariant构造函数QVariant(const QByteArray& val)是否期望QByteArray中的原始字节为空终止?
背景资料:
我的QByteArray对象是使用QByteArray :: fromRawData(const char * data,int size)构造的,并且不是以null结尾的。
我的目标是将QByteArray对象中的原始字节复制到一个带有QSqlQuery :: bindValue()的数据库中,该数据库需要一个Qvariant对象作为其参数之一。
我的猜测是QByteArray中的字节必须以空值终止。我没有看到任何其他方式如何实现QVariant(const QByteArray& val)构造函数。
非常感谢!
答案 0 :(得分:0)
为新人编辑。看看评论。
QByteArray可用于存储两个原始字节(包括'\ 0')和 传统的8位'\ 0'终止字符串。使用QByteArray很多 比使用const char *更方便。 在幕后,它始终如此 确保数据后跟'\ 0'终结符
这意味着,即使你没有将其终止,QByteArray也会确保它。但只有在创建深层副本时...检查size()
int QByteArray :: size()const
返回此字节中的字节数 阵列。字节数组中的最后一个字节位于位置大小() - 1 此外,QByteArray确保位置size()处的字节为 总是'\ 0',这样你就可以使用data()和的返回值 constData()作为期望'\ 0'终止的函数的参数 字符串。 如果QByteArray对象是从原始数据创建的 不包括尾随空终止字符,然后是QByteArray 除非创建了深层副本,否则不会自动添加它。
由于QVariant将使用constData()方法,因此无法确保它将以null结尾。看this gist
答案 1 :(得分:0)
QByteArray中添加的字节可能会也可能不会以0结尾。如果将QByteArray转换为QVariant,它将包含已添加到数组的所有字节,无论它们的值如何。它是可能的,因为QByteArray存储字节数。当你有char*
指针和字节数时,你可以安全地使用字节操作,而不知道是否有0。
实际上,当您调用data()
获取char*
指针时,数据始终以空值终止。但它确实在幕后。如果使用data()
并将该指针传递给某个没有大小的函数,则0-termination将保护您免受段错误的影响。但是你的问题并不重要。
我试着用例子来说明。
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内容相同的字节"。