将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位)包含"幻数"二进制.
一个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将缓冲区中的数据恢复为某种复杂类型.您可以以适当的方式对原始字节数据进行反序列化.
| 归档时间: |
|
| 查看次数: |
8985 次 |
| 最近记录: |