【问题标题】:在构造函数中连接 2 字节数组会产生奇怪的结果
【发布时间】:2022-01-23 12:21:47
【问题描述】:
Qt 6.2.1 MinGW

我有 2 个数组,标题 FirstArray 和正文 SecondArray。我知道复制粘贴在编程方面不好,所以一开始就这样做了:

int main(int argc, char *argv[]) 
{
    QCoreApplication a(argc, argv);
    const QByteArray FirstArray=QByteArray(std::begin<char>({static_cast<char>(0xA5), 0x5A, static_cast<char>(0xB5), 0x5B}), 4);
    const QByteArray SecondArray=QByteArray(FirstArray+std::begin<char>({0x18, 0x00, 0x01, static_cast<char>(0x9B), 0x03, 0x09, 0x00, 0x19, static_cast<char>(0x91)}), 13);
    qDebug()<< SecondArray.toHex();

    return a.exec(); 
}

我期待结果:

"a55ab55b1800019b0309001991"

但在输出中我看到:

"a55ab55b1800adbaababababab"

然后我重写第二个QByteArray初始化,并去掉构造函数中的加号操作:

const QByteArray SecondArray=QByteArray(std::begin<char>({static_cast<char>(0xA5), 0x5A, static_cast<char>(0xB5), 0x5B, 0x18, 0x00, 0x01, static_cast<char>(0x9B), 0x03, 0x09, 0x00, 0x19, static_cast<char>(0x91)}), 13);

我明白了:

"a55ab55b1800019b0309001991"

为什么会在第一种情况下发生?如何正确书写?

【问题讨论】:

  • 你已经知道如何得到正确的输出了,不是吗?
  • 加法运算符期望右手操作数是一个以空值结尾的字符串。 (您希望它如何确定有多少元素?)您可能正遭受未定义行为的困扰。
  • @463035818_is_not_a_number 是的,我可以将标头复制到我的所有数组中,但我想了解为什么第一个变体无法正常工作。它将帮助我将来编辑标题
  • @molbdnilo 好的,以及如何在构造函数中编写正确的初始化

标签: c++ qt qbytearray qt6


【解决方案1】:

正如评论中提到的,你正在打电话

const QByteArray operator+(const QByteArray &a1, const char *a2)

根据其documentation

返回一个字节数组,它是连接字节数组 a1 和字符串 a2 的结果。

它除了 a2 指向一个以 null 结尾的字符串。

您可以将串联重新排列为

FirstArray + QByteArray(std::begin<char>({0x18, ......

调用另一个不依赖于 c 字符串的空终止的重载。

【讨论】:

    猜你喜欢
    • 2014-07-05
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2015-10-04
    • 2014-12-01
    • 1970-01-01
    相关资源
    最近更新 更多