std::string 无法识别大于 127 的字符
std::string doesn't recognize character greater then 127
我已经做了一个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,也许改变你的字符集
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么签名字符可以保存大于 127 的值?
- 我应该使用无符号字符而不是 int 来存储永远不会大于 255 的值吗?
- Zlib 放气输入大于原始输入字符串的字符
- 如何将一个数字(大于8个字节)从字符阵列转换为其ASCII表示
- 用 C++ 编程.字符数组的大小为 5,但也接受大于 5 个字符的值
- 字符数组的字符串长度大于其大小.如何避免
- std::string 无法识别大于 127 的字符
- 如何处理大于字符类型的值