std::string 无法识别大于 127 的字符

std::string doesn't recognize character greater then 127

本文关键字:字符 大于 string std 识别      更新时间:2023-10-16

我已经做了一个ascii码风格的传输,一切都很好,直到我做了crc检查。在我的项目crc是一个字节。在我的接收器中,我把所有东西都放入std::string中,如果crc小于127,则一切正常。但是如果我的crc大于127,那么我的std::string是添加额外的数据-示例如下。

if crc = 80 -> in std:string "P"
if crc = 168 -> in std::string "�" (three diffrent signs)

我做错了什么?我以为127上面有特殊的字符,但是现在我迷路了…

编辑:我试图使它简单,但当然我可以给你代码:)。

QSerialPort *serial = new QSerialPort;
std::string *buffer = new std::string;
//when 'readyRead' event comes from serial then:
QString tempBuffer = serial->readAll();
*buffer += tempBuffer.toStdString();

然后在不同的线程中,我处理缓冲区数据。问题是当我发送一个大于127的字节时-在这种情况下,一些额外的字符被附加到我的缓冲区(如第一个示例)。

问题就在这里:

QString tempBuffer = serial->readAll();
*buffer += tempBuffer.toStdString();

1)您依赖于从QByteArray到QString的默认转换,这是utf-8,而不是本地拉丁1,如果这是您想要的。

QString::QString(const QByteArray &ba)

构造一个用字节数组ba初始化的字符串。使用fromUtf8()将给定的字节数组转换为Unicode。在第一个0字符处停止复制,否则复制整个字节数组。

在这种情况下,你需要对readAll的返回值显式地调用fromLatin1,即:

QString tempBuffer = QString::fromLatin1(serial->readAll());
qDebug() << tempBuffer;

您的需求也可以是本地8位相关的,在这种情况下,您将做类似的事情,但使用fromLocal8Bit。

2)在堆上为std::string对象分配内存是个坏主意。它应该是一个堆栈对象。

3)在这种情况下,如果您完全删除std::string内部数据处理,代码将会简单得多,因为这样您也可以删除QString用于一般操作,并且您可以保留它仅用于数据显示。这样,您还可以使用data()方法获得"原始c数据"。

在处理大于127的字符数据时要记住一些事情,即:

4)您需要为属性设置8个数据位,这是目前的默认值,但您需要确保它不是7位。

5) QIODevice接口处理char*类型的读写,这取决于编译器是有符号的还是无符号的。只要你在接收方和发送方一致地处理它们,这就不会是一个问题。

你可以尝试使用wstring,也许改变你的字符集