c# char unsigned_关于C ++:将unsigned char *复制到unsigned char *

我需要将数据包状态保存一段时间。

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

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

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

到unsigned char []和unsigned char *

我需要复制数据,因为每次读取数据包时,它都会被读取到相同的char *中,因此,当我保存一段时间后,我需要先复制数据

char[]不是完整类型,因此您的问题没有意义。

您对数据包的定义是什么,预先知道的大小是多少? 最大尺寸已知吗? 您需要处理数据包内容吗?

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

std::vector v( buf, buf + datalen );

向量构造函数会将所有数据从buf[0]复制到buf[datalen - 1],并且当向量超出范围时将取消分配内存。您可以使用v.data()或&v[0]获得指向基础缓冲区的指针。

哦,看,一个懂C ++的人。

我个人不建议在任何情况下都在C ++中使用strXXX函数(当然可能有一些地方,但是仍然)

我的清单是记录清单。记录的字段之一是此char数组。

@ user1495181通过记录,我假设您的意思是您有一个struct s或class es的列表。只需将结构中unsigned char *字段的类型更改为std::vector。

我不确定这是否只是答案的编写方式,但是C strXXX函数无法处理嵌套的空字符,而std::string则完全没有问题。选择std::vector与std::string的理由是,如果不是字符串,则不需要std::string接口的额外丰富度。此外,根据域的不同,数组(std::array)或带有嵌套C样式数组的实际结构可能是一个很好的(甚至更好)的解决方案,不需要额外的分配(特别是在C ++ 03中)

@ DavidRodrguez-dribeas感谢您指出,由于与strXXX函数相同的问题,听起来确实不应该使用std::string。立即修复。

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

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

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

您如何复制数据?

可能是memcpy。 strcpy函数的数据中可能包含空字符,这在网络情况下很常见。因此,类似:

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 *的信息,因为那是发布者所要求的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值