【问题标题】:Convert QString to const void*将 QString 转换为 const void*
【发布时间】:2015-11-17 09:21:07
【问题描述】:

我正在使用 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,它会很乐意接受它。能否制作出可读的短信纯属运气。
  • 你的文件描述符是什么类型的?根据其类型,您可能会也可能不会使用 QT 类来访问相同的功能。

标签: c++ parameter-passing qt5 qstring


【解决方案1】:

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

您应该将数据 at 传递到该地址,其大小由字符串的长度给出:

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

【讨论】:

    【解决方案2】:

    试试:

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

    &a 包含void 指针的地址。此外,sizeof(a),当a 是一个指针时,将始终返回相同的长度(可能是 4 或 8 个字节,具体取决于您的架构)。

    【讨论】:

    • 作为进一步的改进,没有必要从中构建 std::string,因为这是 另一个 堆分配和复制。只需存储您已有的内容:const QByteArray utf8String = string.toUtf8(); write(fd, utf8String.constData(), utf8String.size());
    猜你喜欢
    • 2020-11-13
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多