Qt — Преобразование QString в индексы QByteArray — Разделение идентификатора устройства на 3 индекса

Я использую QtSerialPort для отправки последовательных сообщений через COM-порт на модем INSTEON PowerLinc 2413U. Я умею жестко кодировать и отправлять сообщения, но мне нужно отправить одно и то же сообщение, используя переменные идентификаторы устройств. Ниже приведена структура, которую я использовал для отправки статических сообщений:

QByteArray msg;
bool msgStatus;

msg.resize(8);
msg[0] = 0x02;
msg[1] = 0x62;
msg[2] = 0x1B;
msg[3] = 0xE9;
msg[4] = 0x4B;
msg[5] = 0x11;
msg[6] = 0x05;
msg[7] = 0x00;
send(msg,&msgStatus);

Позиции 2,3 и 4 представляют идентификатор устройства. «1BE94B» в этом случае. Моя функция принимает идентификатор устройства, для которого должно быть выполнено действие через QString.

Как я могу преобразовать QString, чтобы соответствовать необходимой структуре из 3 индексов. Я успешно получаю каждый байт 3-байтового адреса, используя следующее:

devID.mid(0,2)
devID.mid(2,2)
devID.mid(4,2)

Моя целевая реализация для QByteArray должна выглядеть так:

QByteArray msg;
bool msgStatus;

msg.resize(8);
msg[0] = 0x02;
msg[1] = 0x62;
msg[2] = devID.mid(0,2)
msg[3] = devID.mid(2,2)
msg[4] = devID.mid(4,2)
msg[5] = 0x11;
msg[6] = 0x05;
msg[7] = 0x00;
send(msg,&msgStatus);

Я перепробовал много разных схем конверсии, но не смог решить, что мне нужно. В конечном итоге мой msg должен быть структурирован как:

    02621DE94B151300

Единственный способ, которым я успешно видел намеченное действие устройства, — это индивидуальное назначение каждого байта в QByteArray, используя msg.append() не похоже на работу.

Спасибо вам за ваши предложения!

1

Решение

Частично проблема заключается в том, что QString основывается на юникоде / шортах, а не на символах. Для меня это работает, когда я использую toLocal8Bit

QByteArray id;
idd.resize(3);
id[0] = 0x1B;
id[1] = 0xE9;
id[2] = 0x4B;

QString devId( bytes );

QByteArray msg;
msg.resize(8);
msg[0] = 0x02;
msg[1] = 0x62;
msg.replace( 2, 3, devId.toLocal8Bit() );
msg[5] = 0x11;
msg[6] = 0x05;
msg[7] = 0x00;

Если ваш идентификатор является текстовым, а не байтовым, то необходимо добавить fromHex:

QString devId( "1BE94B" );
msg.replace( 2, 3, QByteArray::fromHex( devId.toLocal8Bit() ) );
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]