将unsigned char *复制到unsigned char *

时间:2012-08-05 16:04:15

标签: c++

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

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

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

我需要复制数据,因为每次读取数据包时都会被重新加入相同的char *,所以当我保存一段时间后我需要先复制数据

2 个答案:

答案 0 :(得分: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]获取指向底层缓冲区的指针。

答案 1 :(得分:-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.