我有一个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();
}
但是,如果我将其打印出来,字符数组将没有多余的字符。
我尝试检查“ 使用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;
}
答案 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样式强制类型转换。
memcpy
进行了2次调用。)