QVariantMap中的库存字节

时间:2013-08-13 18:00:21

标签: c++ qt byte qt5

我从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的大小很好,但值不好...... 有人知道我做错了什么吗?或者可能知道我是如何做到的?

感谢那些试图帮助我的人。

2 个答案:

答案 0 :(得分:0)

您将二进制数据加载到QByteArray中。然后将此QByteArray中的数据逐字节追加到QString,后者将每个字节转换为unicode。最后但并非最不重要的是,您只是尝试将其转换回原始数据?没门。因此,指出你做错了很容易。

帮助你更困难。当QByteArray不可用时,为什么你认为你可以使用QString?当QVariantMap可用时,您就拥有了完整的Qt。所以使用QByteArray应该不是问题。但我必须承认,我不完全理解你的帖子和你的问题,所以我可能会忽略一些事情。

答案 1 :(得分:0)

您可以直接在QImageQVariant发送QVariantMap。您使用的特定json库如何处理json-to-Qt接口,这是另一个故事。

由于QVariant位于Qt Core而不是Qt Gui,因此在使用QVariant::value()等GUI类型时,必须使用qvariant_cast()QImage模板函数。< / p>