将 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()
或&v[0]
获取指向底层缓冲区的指针。
【讨论】:
哦,看,一个懂C++的人。 就个人而言,我不建议在任何情况下在 C++ 中使用strXXX
函数(可能有一些地方,但仍然如此)
我的列表是记录列表。记录中的一个字段是这个字符数组。
@user1495181 通过 record 我假设你的意思是你有一个struct
s 或class
es 的列表。只需将结构中unsigned char *
字段的类型更改为std::vector<unsigned char>
。
我不确定这是否只是答案编写方式的产物,但是虽然 C strXXX
函数无法处理嵌套的空字符,@987654336 @ 完全没有问题。选择std::vector
与std::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