gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:50:17 29 4
gpt4 key购买 nike

我已经用 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)

Constructs a string initialized with the byte array ba. The given byte array is converted to Unicode using fromUtf8(). Stops copying at the first 0 character, otherwise copies the entire byte array.

您需要调用 fromLatin1在那种情况下明确地在 readAll 的返回值上,即:

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

您的要求也可能与本地 8 位相关,在这种情况下您会做类似的事情,但使用 fromLocal8Bit .

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

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

在处理超过127的字符数据时,有几点需要注意,即:

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

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

关于c++ - std::string 无法识别大于 127 的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23713072/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com