QVariant是否期望以空值终止的QByteArray?

时间:2013-08-08 21:05:05

标签: qt

我需要从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)构造函数。

非常感谢!

2 个答案:

答案 0 :(得分:0)

为新人编辑。看看评论。

From docs

  

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内容相同的字节"。