2016-11-10 155 views
2

我可以初始化QByteArray,如:的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这一问题,有助于?)

+0

你需要存储的'0x00'字节?也许你可以使用'QByteArray :: QByteArray(const char * str)'构造函数? – wally

+0

是的,我需要所有的字节。 – KcFnMi

+3

'的QByteArray M_DATA( “\ X0C \ X06 \ X04 \ X04 \ X02”,6)' –

回答

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})}; 
0

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

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功能。