【问题标题】:QByteArray initializationQByteArray 初始化
【发布时间】:2017-03-24 21:55:10
【问题描述】:

我可以像这样初始化QByteArray

QByteArray m_data;
m_data[0] = 0x0c;
m_data[1] = 0x06;
m_data[2] = 0x04;
m_data[3] = 0x04;
m_data[4] = 0x02;
m_data[5] = 0x00;

但我想要更紧凑的东西,比如:

QByteArray m_data{0x0c, 0x06, 0x04, 0x04, 0x02, 0x00};

很遗憾,不允许使用此表单:

error: could not convert '{12, 6, 4, 4, 2, 0}' from '<brace-enclosed initializer list>' to 'QByteArray'
     QByteArray m_data{0x0c, 0x06, 0x04, 0x04, 0x02, 0x00};
                                                          ^

有没有其他选择(更接近我的梦想)?

(C++11/14/17 对这个问题有帮助吗?)

【问题讨论】:

  • 是否需要存储0x00 字节?也许你可以使用QByteArray::QByteArray(const char * str) 构造函数?
  • 是的,我需要那里的所有字节。
  • QByteArray m_data("\x0c\x06\x04\x04\x02", 6)
  • QByteArray 可以 获得一个带有初始化列表的构造函数,但我认为这不会让你的生活更轻松。 {0x0c, 0x06, ...}ints 的列表,而不是chars,并且那里禁止缩小=> 编译错误。 {char(0x0c), char(0x06), ...} 可以,但写起来很痛苦。只需按照建议使用 QByteArray(Literal)。

标签: qt c++11 qt5 c++14 c++17


【解决方案1】:

您可以让模板计算列表中有多少元素:

using myarr = char[];

template <size_t N>
QByteArray make_QByteArray(const char(&a)[N]) {
    return {a,N};
}

然后创建QByteArray

auto  m_data{make_QByteArray(myarr{0x0c, 0x06, 0x04, 0x04, 0x02, 0x00})};

【讨论】:

    【解决方案2】:

    我正在使用:

    QByteArray data(QByteArray::fromRawData("\x8B\x55\x0C\x83\xFA\x02\x75", 7));
    

    【讨论】:

      【解决方案3】:

      我一直在寻找这样的答案,但在表达式中包含声明的变量;例如:

      char       v1 = 0x06, v2 = 0x04;
      QByteArray m_data;
      
      m_data[0] = 0x0c; m_data[1] =  v1 ; m_data[2] = v2 ;
      m_data[3] =  v2 ; m_data[4] = 0x02; m_data[5] = 0x00;
      //And a character higher than 0x7f
      m_data[6] = 0x8b;
      

      这是我找到的解决方案:

      char        v1 = 0x06, v2 = 0x04;
      QByteArray  ba(std::begin<char>({0x0c, v1, v2, v2, 0x02, 0x00, '\x8b'}), 7);
      

      使用std::begin 甚至std::initializer_list C++11 功能可以实现这一点。

      【讨论】:

      • 但是你必须手动计算元素的数量,这容易出错且无法维护。
      猜你喜欢
      • 2018-02-17
      • 2016-07-19
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多