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

C++ 将无符号字符*复制到无符号字符*,c++,C++,我需要保存一段时间的数据包状态。 因此,我读取数据包数据,它表示为unsigned char*,然后用这个数据创建一个记录,并将该记录保存在列表中一段时间 将记录中的数据包表示为char*或char[]的更好方法是哪一种 如何将读取数据(无符号字符)复制到两个选项: 到无符号字符[]和到无符号字符* 我需要复制数据,因为每次我读取数据包时,它都会被读取到同一个字符*,所以当我保存它一段时间时,我需要先复制数据,所以听起来你需要在列表中保存多个数据包的数据,直到将来某个时候 如果是我,我通常会使用

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

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

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


我需要复制数据,因为每次我读取数据包时,它都会被读取到同一个字符*,所以当我保存它一段时间时,我需要先复制数据,所以听起来你需要在列表中保存多个数据包的数据,直到将来某个时候

如果是我,我通常会使用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.

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

如果是我,我通常会使用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.

如果数据包数据是二进制的,我宁愿使用
std::vector
来存储数据,而不是使用一个C
strXXX
函数,以避免数据流中可能存在的空字符问题。大多数strXXX函数查找空字符并截断其操作。因为数据不是字符串,所以我也要避免使用
std::string

std::vector<unsigned char> v( buf, buf + datalen );
标准向量v(buf,buf+datalen);
向量构造函数将所有数据从
buf[0]
复制到
buf[datalen-1]
,并在向量超出范围时释放内存。如果数据包数据是二进制的,您可以使用
v.data()
&v[0]
获取指向底层缓冲区的指针。我更喜欢使用
std::vector
来存储数据,而不是使用一个C
strXXX
函数,以避免数据流中存在潜在的空字符问题。大多数strXXX函数查找空字符并截断其操作。因为数据不是字符串,所以我也要避免使用
std::string

std::vector<unsigned char> v( buf, buf + datalen );
标准向量v(buf,buf+datalen);
向量构造函数将所有数据从
buf[0]
复制到
buf[datalen-1]
,并在向量超出范围时释放内存。您可以使用
v.data()
&v[0]

char[]
获取指向底层缓冲区的指针,因为它不是一个完整的类型,所以您的问题没有意义。您对数据包的定义是什么,它的大小是预先知道的吗?知道最大尺寸吗?您需要处理数据包内容吗?
char[]
不是一个完整的类型,因此您的问题没有意义。您对数据包的定义是什么,预先知道数据包的大小吗?知道最大尺寸吗?你需要处理包内容吗?哦,看,一个知道C++的人。我个人不会建议在任何情况下使用C++中的代码> Srxxx < /Cord>函数(可能有几个地方,但仍然)我的列表是记录列表。记录中的一个字段是这个字符数组。@user1495181 By record我想你的意思是你有一个
struct
s或
class
es的列表。只需将结构中的
unsigned char*
字段的类型更改为
std::vector
。我不确定这是否只是答案编写方式的产物,但尽管C
strXXX
函数无法处理嵌套的空字符,
std::string
根本没有问题。选择
std::vector
std::string
的理由是,如果它不是字符串,则不需要额外丰富的
std::string
接口。此外,根据域的不同,数组(
std::array
)或带有嵌套C样式数组的实际结构可能是一个不需要额外分配(特别是在C++03中)的好(甚至更好)解决方案,一个知道C++的人。我个人建议在任何情况下都不使用C++中的代码> Struxxx < /Cuff>函数(可能有几个地方,但是)我的列表是记录列表。记录中的一个字段是这个字符数组。@user1495181 By record我想你的意思是你有一个
struct
s或
class
es的列表。只需将结构中的
unsigned char*
字段的类型更改为
std::vector