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