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()
这样的东西,因为<<
运算符不允许你知道字符串有多长并且在第一个空字节处停止写入:
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 发送的主要内容,如果未能解决你的问题,请参考以下文章