【问题标题】:std::string doesn't recognize character greater then 127std::string 不能识别大于 127 的字符
【发布时间】:2014-07-05 22:57:55
【问题描述】:

我已经使用 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 的字节时 - 在这种情况下,一些额外的字符会附加到我的缓冲区(如第一个示例中)。

【问题讨论】:

  • 你能显示你的代码吗?不清楚你在写什么。
  • 感谢您的更新。您确定您使用的是 8 个数据位而不是 7 个数据位吗? dataBits 属性包含什么?
  • 另外,请注意,QIODevice 写入接口是 char,它依赖于编译器。它可以签名也可以不签名。另外,请不要在堆栈上分配 std::string 。此外,甚至不要在这种情况下使用它。只需使用 QByteArray。您正在读取将进行默认转换(latin1?)的 QString,因此,如果您想要 unicode,则必须再次对读取结果进行 fromUtf8 调用,但话又说回来:可以通过删除 std 来消除这种混乱::string 并使用原始 QByteArray。这对解决问题有帮助吗?我还是有点不清楚..
  • 好的 - 我发现了我的错误。我从 QByteArray 隐式转换为 QString 并且 QString 做了所有的事情。现在我使用 QByteArray 和返回 char* 的简单方法 data() ,一切正常。 :D 感谢您的帮助。
  • @LaszloPapp "请不要在堆栈上分配 std::string" - 我假设你的意思是 heap?

标签: c++ string qt qbytearray qtserialport


【解决方案1】:

问题出在这里:

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() method 获取“原始 c 数据”。

在处理127以上的字符数据时有一些注意事项,即:

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

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

【讨论】:

    【解决方案2】:

    您可以尝试使用 wstring 并可能更改您的字符集。

    【讨论】:

    • 他为什么要这么做?那会有什么影响?这解决的根本问题是什么?他应该怎么做?目前,这更像是评论而不是答案。
    • 我对这篇文章投了赞成票,因为至少可以说两次无法解释的反对票是非常不公平的,而且感觉像是试图解决问题的不同方法。为了记录,巴特在聊天中告诉我他不是反对者,所以这可能有助于避免一些不必要的评论争论。这两个人应该考虑更加协作,向试图提供帮助的人提供实际反馈,从而增加网站的价值。这个答案可能对 OP 来说已经足够了,无需进一步解释。
    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2012-02-21
    • 2019-08-30
    • 2014-06-20
    相关资源
    最近更新 更多