什么是C++中的memcpy等价物

Fra*_*era 6 c++

将memcpy用于缓冲区或C++中的字符串相当于什么?

例如:

char message_buffer[32];
uint16_t n = 457u;
memcpy(message_buffer, &n, sizeof(n));
...
Run Code Online (Sandbox Code Playgroud)

就像是:

std::string message_buffer;
uint16_t n = 457u;
std::copy(messagebuffer, n);
Run Code Online (Sandbox Code Playgroud)

没有C++等价物吗?我只是坚持使用memcpy,而是使用std :: string?

std::string message_buffer;
message_buffer.resize(32);
uint16_t n = 457u;
memcpy(&message_buffer[0], &n, sizeof(n));
Run Code Online (Sandbox Code Playgroud)

我想我应该提供更多关于我想要做的事情的背景 - 只是我使用套接字发送和接收数据.数据需要预先附加该数字的16位二进制表示(457).所以我给出的例子只是第一步,之后我复制了我想发送到缓冲区的信息,知道前2个字节(16位)包含"幻数"二进制.

Bau*_*gen 6

一个std::string是字符串.如果你想要一个字节缓冲区,你应该使用std::vector<char>(或它的有符号/无符号对应项).

使用std::copy几乎总是要走的路,特别是在"高级C++领域"及其所有类等的情况下.

但是,我会说当你处理像字节缓冲区这样的低级结构时,C++函数std::memcpy是最合适的选择.请记住,std::memcpy是一个"哑"功能,只复制字节,但考虑到我们正在尝试填充字节缓冲区,这就是我们想要的.

std::vector<char> buffer(32);
uint16_t n = 457u;
std::memcpy(buffer.data(), &n, sizeof(n));
Run Code Online (Sandbox Code Playgroud)

当然,如果你想在一些字节缓冲区中存储一个更复杂的类,例如指针成员或非平凡的复制构造函数(任何不是"普通旧数据"),你需要序列化对象以获得有意义的结果,就像在C中用指针成员的结构一样.

类似地,您不能简单地使用memcpy将缓冲区中的数据恢复为某种复杂类型.您可以以适当的方式对原始字节数据进行反序列化.