同时将多个十六进制数附加到 QByteArray

Append multiple hex numbers to QByteArray simultaneously

我有一堆十六进制数,但我不想做

QByteArray ba;
ba.append(0x01);
ba.append(0x02);
ba.append(0x7A);
...

我可以一行完成吗?也许有 QString 操纵?

我正在通过串行通信发送消息QExtSerialPort,我需要在 QByteArray 中存储十六进制命令,以便我可以使用 qint64 write(const QByteArray &data)

第一点是:没有所谓的十六进制数。数字就是数字。我们在这里谈论整数。不管你说16、0x10、020等等,都是同一个数字。 0x10 是 "hex" 仅在您以十六进制表示法将其写出的意义上。它不会改变数字本身的任何内容,它不会成为 "hex"!还是从零开始递增十六次得到的数字

使用十六进制的唯一原因可能是设备的文档以十六进制给出了命令包。这是一个完全任意的选择。您可以从文档中复制十六进制数字,或者如果对您来说更有意义,也可以将它们转换为其他基数。

所以,十六进制表示当然完全取决于你,你不需要明确地使用它。但是您确实需要以某种方式使用 C 常量数组——它们使事情变得简单且开销低。假设您的命令由三个字节组成,十进制值为 16、33、47。

你可以这样编码:

static const char cmdBuf[] = { 16, 33, 47 };
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf));

字节数组cmd在不复制数据的情况下进行初始化,因此快速高效。 cmdBuf 必须是静态的 因为只要 cmd 或其任何(浅)副本存在,它就必须存在。

您可以使用字符串文字来初始化数组,对不可打印字符使用十六进制转义,否则使用可打印字符。

static const char cmdBuf[] = "\x10!/";
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf)-1);

sizeof(...)-1 的原因是 cmdBuf 的长度为 4 个字节 - 字符串文字以您并不真正需要的终止零结尾。

如果您希望对所有字节使用十六进制表示,您需要

static const char cmdBuf[] = "\x10\x21\x2F";
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf)-1);
// or
static const char cmdBuf[] = { 0x10, 0x21, 0x2F };
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf));

当然你也可以使用八进制:

static const char cmdBuf[] = "017";
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf)-1);
// or
static const char cmdBuf[] = { 020, 041, 057 };
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf));

或它们的任意组合!

static const char cmdBuf[] = "0\x21/";
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf)-1);
//or
static const char cmdBuf[] = { 16, 0x21, 057 };
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf));

在字符串文字中,是将其全部编码为 hex/octal 转义符还是使用可打印字符由您决定,这是一种风格问题。如果命令中的值没有可打印字符的含义,则字符串文字或数组初始值设定项中的数字(十六进制或八进制)编码可能更好。

在八进制和十六进制之间进行选择时,请遵循命令字节的结构或您自己的喜好。如果字节的结构以某种方式分解为 2+3+3 位组,那么八进制是使其易于阅读的好方法。否则,使用十六进制或十进制。这一切都是为了使代码更易于阅读 - 机器不关心,无论您采用哪种方式,二进制输出都是相同的。