我从QImage
中的QByteArray
获取字节数据,我想从QByteArray
中的QVariantMap
写入数据,但是在库存之后字节,字节改变,图像无效......
我试图直接存储QByteArray
,但事实是我将从Windows手机,Android和iOS接收QVariantMap(作为JSON)。并且QByteArray
将不存在于那些操作系统中,因此我怀疑.toByteArray
功能是否有效......
以下是我尝试使用QString
的示例,但填充QString
时字节会发生变化...
QFile tmp("default_profile.jpg");
tmp.open(QIODevice::ReadOnly);
if (tmp.exists() == true)
{
QByteArray tab;
tab = tmp.read(tmp.size());
int i = 0;
char *data = tab.data();
QString str;
while (i != tmp.size())
{
if (i < 100)
qDebug() << "AVANT = " << " i = " << i << "[" << *data + '0' << "]";
i++;
str.append(*data);
++data;
}
QVariantMap *tmp = new QVariantMap();
(*tmp)["name"] = "test.jpg";
(*tmp)["data"] = str;
(*tmp)["size"] = tab.size();
(*tmp)["type"] = "PhonePic";
this->fileReceived("", "", tmp);
}
这是fileReceived
:
QFile tmp((*src)["name"].toString());
tmp.open(QIODevice::ReadWrite | QIODevice::Truncate);
char *test = (char *)malloc((*src)["size"].toInt());
QString str;
str = (*src)["data"].toString();
int i = 0;
char *data = const_cast<char *>(str.toStdString().c_str());
while (i != 8143)
{
if (i < 100)
qDebug() << "AFTER = " << " i = " << i << "[" << *data + '0' << "]";
i++;
++data;
}
qDebug() << tmp.write(str.toStdString().c_str(), (*src)["size"].toInt());
“AFTER”QString的大小很好,但值不好...... 有人知道我做错了什么吗?或者可能知道我是如何做到的?
感谢那些试图帮助我的人。
答案 0 :(得分:0)
您将二进制数据加载到QByteArray中。然后将此QByteArray中的数据逐字节追加到QString,后者将每个字节转换为unicode。最后但并非最不重要的是,您只是尝试将其转换回原始数据?没门。因此,指出你做错了很容易。
帮助你更困难。当QByteArray不可用时,为什么你认为你可以使用QString?当QVariantMap可用时,您就拥有了完整的Qt。所以使用QByteArray应该不是问题。但我必须承认,我不完全理解你的帖子和你的问题,所以我可能会忽略一些事情。
答案 1 :(得分:0)
您可以直接在QImage
或QVariant
发送QVariantMap
。您使用的特定json库如何处理json-to-Qt接口,这是另一个故事。
由于QVariant
位于Qt Core而不是Qt Gui,因此在使用QVariant::value()
等GUI类型时,必须使用qvariant_cast()
或QImage
模板函数。< / p>