1

我需要将数据包状态保存一段时间。所以我读取了表示为 unsigned char* 的数据包数据,然后我用这些数据创建了一条记录,并将记录保存在列表中一段时间​​。

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

如何将读取的数据( unsigned char )复制到两个选项:到 unsigned char[] 和到 unsigned char *

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

4

2 回答 2

10

如果数据包数据是二进制的,我更喜欢使用std::vector它来存储数据,而不是 CstrXXX函数之一,以避免数据流中存在潜在的 NULL 字符的问题。大多数strXXX函数查找 NULL 字符并截断它们的操作。由于数据不是字符串,因此我也会避免std::string执行此任务。

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

向量构造函数将复制所有数据,buf[0]buf[datalen - 1]在向量超出范围时释放内存。v.data()您可以使用or获取指向底层缓冲区的指针&v[0]

于 2012-08-05T16:23:42.273 回答
-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.
于 2012-08-05T16:18:22.490 回答