将无符号字符*复制到无符号字符

Copy unsigned char * to unsigned char*

本文关键字:无符号 字符 复制      更新时间:2023-10-16

我需要保存数据包状态一段时间。因此,我读取了表示为无符号char*的数据包数据,然后用这些数据创建了一个记录,并将该记录保存在列表中一段时间。

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

如何将读取的数据(无符号字符)复制到这两个选项:To unsigned char[]and To unsigned char*

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

如果数据包数据是二进制的,我更喜欢使用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]获取指向底层缓冲区的指针。

因此,听起来您需要将多个数据包中的数据保存在列表中,直到将来某个时候。

如果是我,我通常会使用std::string或std::vector,因为这可以消除分配问题,而且通常速度非常快。

如果您确实打算使用char*或char[],那么您应该使用char*。声明一个像"char-buf[1024];"这样的变量会在堆栈上分配它,这意味着当该函数返回时,它就会消失。要将其保存在列表中,您需要动态分配它,因此您可以执行类似"char*buf=new char[packet.size];"的操作,然后复制数据并将指针和数据长度存储在列表中(或者,正如我之前所说,使用std::string,避免单独保留长度)。

如何复制数据?

可能是记忆。strcpy函数会遇到数据中可能有零字符的问题,这在网络环境中很常见。所以,类似于:

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