将 unsigned char * 复制到 unsigned char*

Posted

技术标签:

【中文标题】将 unsigned char * 复制到 unsigned char*【英文标题】:Copy unsigned char * to unsigned char* 【发布时间】:2012-08-05 16:04:15 【问题描述】:

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

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

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

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

【问题讨论】:

char[] 不是一个完整的类型,所以你的问题没有意义。 您对数据包的定义是什么,是否预先知道大小?最大尺寸是否已知?是否需要处理数据包内容? 【参考方案1】:

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

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

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

【讨论】:

哦,看,一个懂C++的人。 就个人而言,我不建议在任何情况下在 C++ 中使用strXXX 函数(可能有一些地方,但仍然如此) 我的列表是记录列表。记录中的一个字段是这个字符数组。 @user1495181 通过 record 我假设你的意思是你有一个structs 或classes 的列表。只需将结构中unsigned char * 字段的类型更改为std::vector&lt;unsigned char&gt; 我不确定这是否只是答案编写方式的产物,但是虽然 C strXXX 函数无法处理嵌套的空字符,@987654336 @ 完全没有问题。选择std::vectorstd::string 的理由应该是如果不是字符串,则不需要std::string 接口的额外丰富性。此外,根据域的不同,array (std::array) 或具有嵌套 C 样式数组的真实结构可能是不需要额外分配的好(甚至更好)解决方案(特别是在 C++03)【参考方案2】:

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

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

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

如何复制数据?

可能是内存。 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 而不是手动管理内存。 我确实建议 std::string (虽然 std::vector 也很好)。我包含了有关 char* 的信息,因为这是发帖人所要求的。

以上是关于将 unsigned char * 复制到 unsigned char*的主要内容,如果未能解决你的问题,请参考以下文章

如何将std :: string复制到unsigned char数组?

unsigned char 和 signed char 区别

将非null终止的unsigned char数组复制到std :: string

将 char* 转换为 unsigned char*

std::string 与 unsigned char[] 和 unsigned char* 有啥不同?

带有 unsigned char * 的内存泄漏