QByteArray 到 char*,用 libcurl 发送

Posted

技术标签:

【中文标题】QByteArray 到 char*,用 libcurl 发送【英文标题】:QByteArray to char*, sending with libcurl 【发布时间】:2010-09-20 14:33:07 【问题描述】:

我无法将 QPixmap 保存到 QByteArray,然后将其写入 char*。 例如,我正在尝试使用 ofstream 写入文件。

                 QByteArray bytes;
                 QBuffer buff(&bytes);
                 buff.open(QIODevice::ReadOnly);
                 pixmap.save(&buff, "PNG");

                 QString str(bytes);

                 char *data;
                 data =  (char*)qstrdup(str.toAscii().constData());

                ofstream myfile;
                 myfile.open ("test.jpg");
                   myfile << data;
                   myfile.close();

但我在该文件中得到的只是:

‰PNG

我需要一个 char* 的原因是因为我在写入磁盘时遇到了一些权限问题,然后使用 libcurl 发送。 我想将它加载到 char* 中,然后直接从内存中发送。

【问题讨论】:

您的 Qt 安装中是否安装了 JPEG 或 PNG 图像格式插件?此外,您应该在 PNG 或 JPEG 格式之间做出选择。 是的,我遇到了 jpeg 插件问题,但 png 似乎很好,因为当我在 windows 中尝试 pixmap.save(filename,format) 时它可以工作。 再提醒一下,我的libcurl有点生疏了,这个文件里面用什么选项发送? 【参考方案1】:

您遇到一个空字节。你需要像write() 这样的东西,因为&lt;&lt; 运算符不允许你知道字符串有多长并且在第一个空字节处停止写入:

const QByteArray array = str.toAscii();
myfile.write(array.constData(), array.size());

【讨论】:

我认为这很可能是问题,但 OP 可能也想使用 buff.open(QIODevice::WriteOnly) 因为他们正在写入缓冲区,以防 pixmap.save() 不不要关闭它,用 buff.close() 跟随它。 是的,谢谢,但我正在写入一个文件,只是想看看我是否可以将 QByteArray 转换为 char*。我要求的是,我如何将该数组转换为 char*。我试过 strcpy(data,array.constData());但它不起作用。 strcpy 也依赖于空字节,试试 memcopy(data, array.constData(), array.size())。【参考方案2】:

用这个解决了这个问题:

 memcpy(data,bytes.constData(),bytes.size()+1);

至少应该尝试过。

【讨论】:

+1 并不是绝对必要的,因为 bytes.constData() 正好是 bytes.size() 长。【参考方案3】:

没有直接关系,但你有什么理由使用 libcurl 而不是集成的 QNetworkAccessManager?

【讨论】:

从未尝试过,我有点习惯于 libcurl。但我想我会试一试。【参考方案4】:

您可以使用strdup()。这个方法就是这样做的

char *strdup (const char *s) 
    char *d = malloc (strlen (s) + 1);   // Space for length plus nul
    if (d == NULL) return NULL;          // No memory
    strcpy (d,s);                        // Copy the characters
    return d;                            // Return the new string

更多信息在这里:strdup() - what does it do in C?

这样你得到一个char*,而ConstData() 将返回一个const char*

【讨论】:

以上是关于QByteArray 到 char*,用 libcurl 发送的主要内容,如果未能解决你的问题,请参考以下文章

Qt char * 转QString

将 QByteArray 转换为 char* 的问题

用Qstring给char[]数组赋值(转)

QT:QByteArray和QByteArraychar *(转)

Qt每天一例14.char数组浅拷贝为QByteArray

QbyteArray转vector<char>的方法