寻找 C memcpy 等价物

问题描述 投票:0回答:1

将字节从 src 写入 dst 的最有效(不安全)方式

我发现copy_nonoverlapping

pub unsafe fn copy_nonoverlapping(src: *const T, dst: *mut T, count: usize)
将 count * size_of::() 个字节从 src 复制到 dst。来源和 目的地不得重叠

我要写的数据位于索引

buf
4
中,我想在(变量)索引
_bytes_buff
index * MAX_DATA_LENGTH
中写入它。
MAX_DATA_LENGTH
大约是 64Kb.

但是我在让它工作时遇到了一些麻烦。请参阅下面我当前尝试正确编写它的片段:

let mut  _bytes_buf:Vec<u8>; // big buffer, we don't know the total size at compilation
let mut buf = [0u8; MAX_DATA_LENGTH]; // small buffer

// [...] we now know the size, I write '3' below to make it simple

let len:usize = MAX_DATA_LENGTH * 3 as usize;
_bytes_buf = Vec::with_capacity(len); // any difference with !vec[0; len] ?
unsafe { _bytes_buf.set_len(len); }

// [...] each time buf has a different content and index is either 0, 1 or 2.

unsafe {
    let dst_ptr = &_bytes_buf[index * MAX_DATA_LENGTH].offset(MAX_DATA_LENGTH as isize); 
    let src_ptr = &buf[4];
    ptr::copy_nonoverlapping(src_ptr, dst_ptr, MAX_DATA_LENGTH);
}

我怎样才能让它工作(最后一个不安全的块)?我找到了很多信息,但有些信息已被弃用或过时,所以我正在寻找从 2021 年开始的方法。

此外,如果这不是最佳方法(

copy_nonoverlapping
),我将非常感谢了解更多有关我应该如何做的信息!

rust
1个回答
10
投票

Rust 的安全版本

memcpy
<[u8]>::copy_from_slice
:

const MAX_DATA_LENGTH: usize = 64000;

let mut bytes_buf = vec![0u8; MAX_DATA_LENGTH * 3];
let buf = [0u8; MAX_DATA_LENGTH];
let index = 0;

bytes_buf[index*MAX_DATA_LENGTH..(index+1)*MAX_DATA_LENGTH-4].copy_from_slice(&buf[4..]);

如果你真的想要更直接的等价物,

copy_nonoverlapping
,这是怎么做的:

unsafe {
    let dst_ptr = &mut bytes_buf[index*MAX_DATA_LENGTH] as *mut u8;
    let src_ptr = &buf[4] as *const u8;
    std::ptr::copy_nonoverlapping(src_ptr, dst_ptr, MAX_DATA_LENGTH-4);
}

但是,除非有必要,否则不要使用

unsafe
,并且您了解需要确保的安全保证safe.

© www.soinside.com 2019 - 2024. All rights reserved.