QT String to char *添加额外的字符

时间:2018-11-13 14:11:26

标签: qt

我有一个qTextEdit,我从(QString)抓取了文本,并使用以下代码转换为char*

QString msgQText = ui->textMsg->toPlainText();
size_t textSize = (size_t)msgQText.size();

if (textSize > 139) {
    textSize = 139;
}

unsigned char * msgText = (unsigned char *)malloc(textSize);

memcpy(msgText, msgQText.toLocal8Bit().data(), textSize);

msgText[textSize] = '\0';

if (textSize > 0) {
    Msg * newTextMsg = new Msg;
    newTextMsg->type = 1;  // text message type
    newTextMsg->bitrate = 0;
    newTextMsg->samplerate = 0;
    newTextMsg->bufSize = (int)textSize;
    newTextMsg->len = 0;
    newTextMsg->buf = (char *)malloc(textSize);
    memcpy((char *)newTextMsg->buf, (char *)msgText, textSize);

    lPushToEnd(sendMsgList, newTextMsg, sizeof(Msg));

    ui->sendRecList->addItem((char *)newTextMsg->buf);

    ui->textMsg->clear();
}

我将文本放到qListBox中,但显示为wrong text

但是,如果我将其打印出来,字符数组将没有多余的字符。

我尝试检查“ 使用UTF-8编译”选项,但没有任何区别。

此外,我使用 RS232 发送文本,并且接收方也显示了多余的字符。

接收方代码在这里:

m_serial->waitForReadyRead(200);
const QByteArray data = m_serial->readAll();
if (data.size() > 0) {
    qDebug() << "New serial data: "  << data;

    QString str = QString(data);
    if (str.contains("0x6F8C32E90A")) {
        qDebug() << "TEST SUCCESSFUL!";
    }

    return data.data();
} else {
    return NULL;
}

1 个答案:

答案 0 :(得分:1)

QString的大小与toLocal8Bit()返回的QByteArray的大小之间存在差异。 QString包含以UTF-16格式存储的unicode文本,而QByteArray恰好是char[]

QByteArray以空值结尾,因此您无需手动添加它。

@GM指出:msgText[textSize] = '\0';是未定义的行为。您正在写入textSize + 1数组的msgText位置。 该职位可能归其他人所有,并且可能会被覆盖,因此您最终得到一个非null终止的字符串。

这应该有效:

QByteArray bytes = msgQText.toLocal8Bit();
size_t textSize = (size_t)bytes.size() + 1; // Add 1 for the final '\0'
unsigned char * msgText = (unsigned char *) malloc(textSize);
memcpy(msgText, bytes.constData(), textSize);

其他提示:

  • 首选在写时复制的Qt类型上使用const函数,例如使用QBytearray::constData()而不是QByteArray::data()。非const函数会导致对象的深层复制。

  • 如果可能,请勿使用malloc()和其他C样式函数。您可以在这里做: unsigned char * msgText = new unsigned char[textSize];和更高版本的delete[] msgText;

  • 更喜欢使用C ++强制类型转换(static_cast,reinterpret_cast等),而不是C样式强制类型转换。

  • 鉴于您的代码似乎只有1个就足够了,因此您正在制作文本的2个副本(对memcpy进行了2次调用。)