The*_*red 2 c++ qt hex qbytearray
我有一堆十六进制数字,但我不想这样做
QByteArray ba;
ba.append(0x01);
ba.append(0x02);
ba.append(0x7A);
...
Run Code Online (Sandbox Code Playgroud)
我可以一行吗?也许是QString操纵?
我通过串行通信发送消息QExtSerialPort,我需要在QByteArray中存储Hex命令,以便我可以使用qint64 write(const QByteArray &data)
第一点是:没有十六进制数字这样的东西.数字是数字.我们在这里谈论整数.无论你说16,0x10,020等,它都是相同的数字.0x10只有在以十六进制表示法写出的意义上才是"十六进制".它没有改变任何关于数字本身,它不会使它"十六进制"!它仍然是你从零增加16倍得到的数字.
十六进制的唯一原因是设备的文档可能以十六进制形式提供命令包.这是一个完全随意的选择.您可以从文档中复制十六进制数字,或者如果它对您更有意义,则将它们转换为另一个基数.
因此,十六进制表示当然完全取决于您,您不需要明确地使用它.但是你确实需要以某种方式使用C常量数组 - 它们使事情简单且开销低.假设您的命令由三个字节组成,十进制值为16,33,47.
你可以编码如下:
static const char cmdBuf[] = { 16, 33, 47 };
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf));
Run Code Online (Sandbox Code Playgroud)
在cmd不复制数据的情况下初始化字节数组,因此快速有效.的cmdBuf必须是静态的,因为它必须只要存在,cmd或任何其(浅)拷贝做.
您可以使用字符串文字初始化数组,使用十六进制转义符表示不可打印字符,否则使用可打印字符.
static const char cmdBuf[] = "\x10!/";
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf)-1);
Run Code Online (Sandbox Code Playgroud)
原因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));
Run Code Online (Sandbox Code Playgroud)
当然你也可以使用八进制:
static const char cmdBuf[] = "\020\041\057";
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));
Run Code Online (Sandbox Code Playgroud)
或者它们的任何组合!
static const char cmdBuf[] = "\020\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));
Run Code Online (Sandbox Code Playgroud)
在字符串文字中,无论您将其全部编码为十六进制/八进制转义符还是使用可打印字符都取决于您,这是一种风格问题.如果命令中的值不具有可打印字符的含义,则字符串文字或数组初始值设定项中的数字(十六进制或八进制)编码可能更好.
在八进制和十六进制之间进行选择时,请遵循命令字节的结构或您自己的首选项.如果字节的结构以某种方式分解为2 + 3 + 3位的组,那么八进制是一种使其易读的好方法.否则,使用十六进制或十进制.这就是为什么使代码更容易阅读 - 机器无关紧要,无论你采用哪种方式,二进制输出都是相同的.