Добавление дополненного числа как QString в QByteArray приводит к появлению нежелательного символа

У меня есть 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 ответа

Решение

Используйте это: 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)

Чтобы исправить это, вы либо добавляете отсутствующий параметр (и используете ожидаемый 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/

Другие вопросы по тегам