2012-08-05 148 views
1

我需要将数据包状态保存一段时间。 因此,我读取了表示为无符号字符*的数据包数据,并且使用此数据创建了一条记录,并将该记录保存在列表中一段时间​​。将无符号字符*复制到无符号字符*

这将是一种更好的方法来将记录中的数据包表示为char *或char []。

我如何读取数据(无符号字符)复制到两个选项: 为unsigned char []和为unsigned char *

我需要复制的数据,因为每次我读时包时,它会被拿到相同的字符*,所以当我保存一段时间,我需要先复制数据

+2

'char []'不是一个完整的类型,所以你的问题没有意义。 – 2012-08-05 16:23:55

+0

你对一个*包的定义是什么?是预先知道的大小?最大尺寸是否已知?你需要处理数据包内容吗? – 2012-08-05 16:41:52

回答

10

如果分组数据是二进制的我宁愿用std::vector来存储数据,而不是的C- strXXX功能之一,以避免在一个潜在的NULL字符存在的问题数据流。大多数strXXX函数查找NULL字符并截断其操作。由于数据不是字符串,因此我也避免使用std::string来完成此任务。

std::vector<unsigned char> v(buf, buf + datalen); 

的载体构造将从buf[0]复制所有数据,以buf[datalen - 1]当矢量超出范围会回收内存。您可以使用v.data()&v[0]获得指向底层缓冲区的指针。

+8

哦,看,知道C++的人。 – 2012-08-05 16:24:55

+1

就个人而言,我不会建议在任何**情况下使用C++中的'strXXX'函数(以及可能有几个地方,但仍然) – Grizzly 2012-08-05 16:29:12

+0

我的列表是记录列表。记录中的一个字段是这个char数组。 – 2012-08-05 16:31:28

-3

所以,这听起来像你需要保存列表中的多个数据包的数据,直到将来的某个点。

如果是我,我会正常使用std :: string或std :: vector,因为这会消除分配问题,并且通常很快。

如果你打算使用char *或char [],那么你会想要使用char *。声明一个变量,如“char buf [1024];”将它分配给堆栈,这意味着当该函数返回时,它将消失。为了将它保存在列表中,你需要动态分配它,所以你可以做一些像“char * buf = new char [packet.size];”然后复制数据并将指针和数据的长度存储在列表中(或者,如前所述,使用std :: string避免单独保留长度)。

如何复制数据?

大概是memcpy。 strcpy函数在数据中可能有nul个字符,这在网络环境中很常见。所以,像这样:

char *buf = new char[packet_length]; 
memcpy(buf, packet_data, packet_length); 
// Put buf and packet_length into a structure in your list. 
+0

否否否否否。使用'std :: vector'而不是手动管理内存。 – 2012-08-05 16:50:15

+0

我确实建议std :: string(尽管std :: vector也很好)。我包含了关于char *的信息,因为这是海报问到的。 – cds 2012-08-05 17:02:25

相关问题