将填充数字作为 QString 添加到 QByteArray 会产生不需要的字符
Adding padded number as QString to QByteArray produces unwanted character
我有一个 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[=24=]2”,结果远程机器上的电报处理失败(我使用 reg ex 进行解析)。如果我没记错的话,[=15=]
是终止字符,但它绝对是我不希望在我的字节数组中看到的东西。
使用这个:
QString paddedIdx = QString("%1").arg(QString::number(idx), 3, QChar('0'));
您的问题的原因是您对 arg()
的调用缺少基本参数。所以不是调用
QString::arg(int a, int fieldWidth, int base, const QChar& fillChar)
编译器选择匹配的重载,隐式转换为(不可打印的)字符并调用
QString::arg(QChar a, int fieldWidth, const QChar& fillChar)
要解决此问题,您可以添加缺少的参数(并使用 3 的预期 fieldWidth
而不是示例中的 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/
我有一个 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[=24=]2”,结果远程机器上的电报处理失败(我使用 reg ex 进行解析)。如果我没记错的话,[=15=]
是终止字符,但它绝对是我不希望在我的字节数组中看到的东西。
使用这个: QString paddedIdx = QString("%1").arg(QString::number(idx), 3, QChar('0'));
您的问题的原因是您对 arg()
的调用缺少基本参数。所以不是调用
QString::arg(int a, int fieldWidth, int base, const QChar& fillChar)
编译器选择匹配的重载,隐式转换为(不可打印的)字符并调用
QString::arg(QChar a, int fieldWidth, const QChar& fillChar)
要解决此问题,您可以添加缺少的参数(并使用 3 的预期 fieldWidth
而不是示例中的 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/