2015-11-02 123 views
0

我正在开发一个应用程序来发送和接收数据包。向C++向量添加新字段

我正在使用std::vector类(首先我开始在数组中创建数据包,如果您更好地建议,我会公开更改该方法)。

我找到了this智能功能将任何const char*添加到vector对象。但我想做一个像{.. , ..}之间添加它们,就像我可以在C#中做的那样。这里的一个例子:

vector<char*> packet; 

char dest[] = { 0x10, 0x10, 0x0, 0x61 }; 
AppendLiteral(packet, dest); //Ok 

/*Or directly:*/ AppendLiteral(packet, { 10, 10, 0, 20 }); //But this does not work 

它可能在c + +?我知道在C#中你可以做这样的事情。

编辑:

一种可能的解决方案是:

vector<uint8> telegram; 

vector<uint8> src = { 0x10, 0x10, 0x0, 0x20 }; 
vector<uint8> dst = { 0x10, 0x10, 0x0, 0x60 }; 

telegram.insert(telegram.end(), dst.begin(), dst.end()); 
telegram.insert(telegram.end(), src.begin(), src.end()); 

随着一点点函数写少:

template <typename T> 
void Append(vector<T> *data, vector<T> *data2) 
{ 
    data->insert(data->end(), data2->begin(), data2->end()); 
} 
+0

你的意思是'std :: vector'? – juanchopanza

+0

是@juanchopanza – ars1614

+0

你确定最后一行中的数字没有被解析,就好像它们是“int”一样吗? – BinarySpark

回答

0

当然。

std::vector<std::array<char, 4>> packet; 

试试这个。

+0

不知道这是否会将'int's添加到'char *'向量虽然... –

+0

我不习惯在C++中编写很多代码,所以我复制粘贴代码在我的程序中,与T得到一个模棱两可的模板参数错误。我添加十六进制值,所以我不知道是否字符类型是最佳的(在C#中我使用字节数组) – ars1614

+0

似乎我错了问题... – iDingDong

3

您的vector<char*>只包含指向char类型变量的指针。它不包含任何数据。这是很危险的,因为如果指向的对象超出范围,指针可能会变得悬而未决。

更好地使用数据类型作为您的vector的元素类型。如果要存储字符串,请使用std::vector<std::string>。如果要保留诸如char[4]之类的对象,请使用std::vetor<std::array<char,4>>。如果要保存任意长度的字节数组,请使用std::vetor<std::vector<char>>

int main() 
{ 
    using packet=std::array<char,4>; // also works with packet=std::string 
            //    or packet=std::vector<char> 

    std::vector<packet> packets; 

    packets.push_back({0x10, 0x10, 0x0, 0x61}); 
    packets.push_back({10, 10, 0, 20}); 

    packet p={0x2,0x4,0xa,0xb}; 
    packets.push_back(p); 
} 
+0

我明白了,我会做的。谢谢 – ars1614

+0

我试过这个,但它似乎不起作用。你将如何加入两个arrais? – ars1614

+0

你尝试了什么,什么不起作用?更加详细一些。此外,你还在继续改变你的问题 - 这很糟糕,因为很难击中移动目标。 – Walter