将QString转换为const void*

3
我正在使用Qt5开发一款用于在我的Mac上发送短信的软件。我正在使用UMTS Stick和库"unistd.h"来写入文件描述符。问题是我不知道如何使用函数"ssize_t write(int fd, const void *buf, size_t count)"。在Qt5中,我有一个QTextEdit,我想将其中的文本作为参数传递给函数write
以下代码没有错误,但它不起作用。是否有错误?
QString smsText = ui->smsTextField->toPlainText();

std::string utf8_text = smsText.toUtf8().constData();
const void * a = utf8_text.c_str();

write(fd, &a, sizeof(a));

通过C++编译器的检查并不意味着结果是有意义的!特别是"unistd.h"非常原始,不会检查其参数。 void* 可以是任何东西。你可以传递任何编码的Unicode,它都会很高兴地接受。无论这是否能生成可读的SMS纯粹是运气问题。 - MSalters
你的文件描述符是什么类型?根据它的类型,你可能需要或者不需要使用QT类来访问相同的功能。 - fjardon
2个回答

3

有两个相关的问题。你正在使用&asizeof(a)作为参数。这基本上意味着你正在将指针a中存储的地址写入流中。

相反,你应该传递在该地址处的数据,并且大小由字符串的长度给出:

write(fd, a, utf8_text.size());

2

尝试:

write(fd, utf8_text.c_str(), utf8_text.size()); 

&a 包含你的 void 指针的地址。此外,当 a 是指针时,sizeof(a) 总是返回相同的长度(根据你的架构可能是 4 或 8 字节)。


作为进一步的改进,没有必要将其构建为std::string,因为那是另一个堆分配和复制。只需存储您已经拥有的内容:const QByteArray utf8String = string.toUtf8(); write(fd,utf8String.constData(),utf8String.size()); - peppe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接