gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:20 26 4
gpt4 key购买 nike

在 C++ 中将 memcpy 用于缓冲区或字符串有什么等价物?

例如:

char message_buffer[32];
uint16_t n = 457u;
memcpy(message_buffer, &n, sizeof(n));
...

类似于:

std::string message_buffer;
uint16_t n = 457u;
std::copy(messagebuffer, n);

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

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

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

最佳答案

std::string用于字符串。如果你想要一个字节缓冲区,你应该使用 std::vector<char> (或其已签名/未签名的拷贝)或 std::array取而代之的是小的固定长度缓冲区。

使用 std::copy几乎总是要走的路,尤其是在“高级 C++ 领域”及其所有类等中。

但是,我想说的是,当您处理字节缓冲区等低级构造时,C++ 函数 std::memcpy是最合适的选择。请记住,std::memcpy是一个只复制字节的“哑”函数,但考虑到我们正在尝试填充字节缓冲区,这就是我们想要的。

std::array<char, 32> buffer;
uint16_t n = 457u;
std::memcpy(buffer.data(), &n, sizeof(n));

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

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

关于c++ - C++ 中的 memcpy 等价物是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32674099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com