2015-10-26 62 views
1

我想在我的代码中的二进制文本数组作为文字。这些消息非常小,所以我认为使用'二进制'文字最容易。但怎么做呢?如何创建一个二进制文字数组

我试过这段代码:

struct binary_message 
{ 
    binary_message(int size, unsigned char* bytes) : size_(size), bytes_(bytes) {} 
    int size_; 
    unsigned char* bytes_; 
}; 

binary_message messages[] = { 
    { 3, { 0x1, 0x2, 0x3 } }, 
    { 2, { 0x1, 0x2 } }, 
    { 1, { 0x1 } } 
}; 

与Visual Studio 2013 C++编译器,我得到错误:

error C2440: 'initializing' : cannot convert from 'initializer-list' to 'binary_message'. No constructor could take the source type, or constructor overload resolution was ambiguous 

使用g ++我得到:

>g++ main.cpp 
main.cpp:13:1: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default] 
main.cpp:13:1: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default] 
main.cpp:13:1: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default] 
main.cpp:13:1: error: could not convert '{3, {1, 2, 3}}' from '<brace-enclosed initializer list>' to 'binary_message' 
main.cpp:13:1: error: could not convert '{2, {1, 2}}' from '<brace-enclosed initializer list>' to 'binary_message' 
main.cpp:13:1: error: invalid conversion from 'int' to 'unsigned char*' [-fpermissive] 
main.cpp:4:2: error: initializing argument 2 of 'binary_message::binary_message(int, unsigned char*)' [-fpermissive] 

如果我用G ++ -std = C++ 0x main.cpp我仍然得到:

main.cpp:13:1: error: could not convert '{3, {1, 2, 3}}' from '<brace-enclosed initializer list>' to 'binary_message' 
main.cpp:13:1: error: could not convert '{2, {1, 2}}' from '<brace-enclosed initializer list>' to 'binary_message' 
main.cpp:13:1: error: invalid conversion from 'int' to 'unsigned char*' [-fpermissive] 
main.cpp:4:2: error: initializing argument 2 of 'binary_message::binary_message(int, unsigned char*)' [-fpermissive] 

我该如何解决这个问题?

UPDATE

我想你的意思是这样的吗?

#include <vector> 
#include <iostream> 

struct binary_message 
{ 
    binary_message(std::initializer_list<unsigned char> data) : bytes_(data) {} 
    std::vector<unsigned char> bytes_; 
}; 

int main() 
{ 
    binary_message messages[] = { 
      { 0x1, 0x2, 0x3 }, 
      { 0x1, 0x2 }, 
      { 0x1 } 
    }; 

    binary_message msg1 = messages[0]; 

    return 0; 
} 
+0

二进制文字是C++ 14的实际东西,看起来像'0b100110' - 如果这不是你的意思,你应该澄清你想要做什么。 – melak47

+0

您正在使用十进制文字(如“3”)和十六进制文字(如“0x3”)的组合。但是,无论您将这些整数值表示为十进制,十六进制,八进制还是二进制等,它们仍然只是编译器的编号。在运行时没有与该表示相对应的优化。 –

+0

使用'const',你可以做一些像'“\ x01 \ x02 \ x03”' – Jarod42

回答

1

如果你想使用初始化列表构造你的对象,你需要一个初始化列表构造函数。您当前的构造函数接受缓冲区和缓冲区的大小,但{ 3, { 0x1, 0x2, 0x3 } }就是这样 - 它是数字和初始化程序列表的初始化程序列表。

要正确使用初始化列表,你的类和构造应该寻找大致如下:

binary_message(std::initializer_list<int> data) : data(data) {} 
... 
std::vector<int> data; 

而且你不会用size在所有 - 向量的大小会告诉你。

相关问题