将填充的数字作为QString添加到QByteArray会产生不需要的字符

时间:2017-11-02 08:54:35

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

我有一个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是终止字符,但它绝对是我在字节数组中看不到的东西。

2 个答案:

答案 0 :(得分:2)

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

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

编译器选择匹配的重载,对(不可打印的)char进行隐式转换并调用

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')));
BTW,使用调试器并单步执行代码来检测此行为相当容易。它也比写一个SO问题更快。推荐阅读:https://ericlippert.com/2014/03/05/how-to-debug-small-programs/

答案 1 :(得分:0)

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