【问题标题】:Adding padded number as QString to QByteArray produces unwanted character将填充数字作为 QString 添加到 QByteArray 会产生不需要的字符
【发布时间】:2018-04-14 17:29:17
【问题描述】:

我有一个QByteArray,其中包含特殊格式的电报,然后通过 UDP 将其发送到远程机器以进行进一步处理。我使用QByteArray::append() 将电报放在一起。

电报的组成部分之一是索引:1、2、3、...、999。该索引需要在前面用零填充:001、002、003、...、999。为了做到这一点,我最初为测试目的对索引进行了硬编码:

...
telegram.append("001");
...

但后来我显然不得不转向更通用的解决方案,例如

...
QString paddedIdx = QString("%1").arg(idx, 2, QChar('0'));
telegram.append(paddedIdx);
...

最初的尝试没有任何问题。查看telegram 的已调试内容,我可以看到“002”附加到字节数组中。但是,使用新解决方案时,我得到“0\002”,因此远程机器上的电报处理失败(我使用 reg ex 进行解析)。如果我没记错的话,\0 是终止字符,但它绝对是我不希望在我的字节数组中看到的东西。

【问题讨论】:

  • 我会更简单并使用“QString::prepend”而不是参数实现。 doc.qt.io/qt-5/qstring.html#prepend
  • "0\002" 不是{'0', NULL, '0', '2'} 它是{'0', 2}。这是因为\002 是八进制数002

标签: arrays string qt null-terminated zero-padding


【解决方案1】:

问题的原因是您对arg() 的调用缺少基本参数。所以不要打电话

QString::arg(int a, int fieldWidth, int base, const QChar& fillChar)

编译器选择匹配的重载,隐式转换为(不可打印的)字符并调用

QString::arg(QChar a, int fieldWidth, const QChar& fillChar)

要解决此问题,您可以添加缺少的参数(并使用预期的 fieldWidth 3 而不是示例中的 2)

QString paddedIdx(QString("%1").arg(idx, 3, 10, QChar('0')));

或使用更详细的结构

QString paddedIdx(QString::number(idx).rightJustified(3, QChar('0')));

顺便说一句,使用调试器并单步执行代码很容易检测到这种行为。它也比写一个 SO 问题要快。推荐阅读:https://ericlippert.com/2014/03/05/how-to-debug-small-programs/

【讨论】:

    【解决方案2】:

    使用这个: QString paddedIdx = QString("%1").arg(QString::number(idx), 3, QChar('0'));

    【讨论】:

    • 确实,在填充之前将数字转换为字符串就可以了。
    猜你喜欢
    • 2023-03-28
    • 2013-12-25
    • 2017-11-04
    • 2012-12-01
    • 2012-04-21
    • 2012-12-17
    • 2021-10-26
    • 2018-12-22
    • 2019-04-19
    相关资源
    最近更新 更多