c++ - Qt - 将 QString 转换为 QByteArray 的索引 - 将设备 ID 分成 3 个索引

标签 c++ qt type-conversion qstring qbytearray

我正在使用 QtSerialPort 通过 COM 端口将串行消息发送到 INSTEON PowerLinc 2413U 调制解调器。我可以很好地硬编码和发送消息,但是我需要使用可变设备 ID 发送相同的消息。以下是我用来发送静态消息的结构:

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 代表设备 ID。本例中为“1BE94B”。我的函数接受应该通过 QString 执行操作的设备 ID。

如何转换 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() 似乎不起作用。

感谢您的建议!

最佳答案

这里的部分问题是 QString 是基于 unicode/short 而不是基于字符的。对我来说,它在我使用 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;

如果您的 id 是文本,而不是字节,则必须添加 fromHex:

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

关于c++ - Qt - 将 QString 转换为 QByteArray 的索引 - 将设备 ID 分成 3 个索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14929769/

相关文章:

java - 以位 : Error 表示整数

C++整数层函数

c++ - 为什么我不能在全局范围内访问我的数组下标

QtQuick LocalStorage 数据库版本不匹配(ini 文件中缺少 "Version"属性)

qt - QDir::tempPath() 与 QStandardPaths::writableLocation()

Java - 将十六进制字符串解析为 ASN.1 格式

c++ - 将数据存储到多维数组中

c++ - 如何将 Windows GUID 转换为 boost::uuid?

python - 具有透明背景的 Qt 小部件

c++ - 如何将 char 值转换为特定的 int 值