Vector 将值片强制转换为字节片

Vector 将值片强制转换为字节片,vector,casting,rust,Vector,Casting,Rust,我正在试验一个API,调用方提供一个Vec,他们希望我用数据填充它。他们可以通过使用和_capacity创建向量来分配空间,然后通过执行推送(点{…})来推送其大小。然后,我将用磁盘中的字节填充底层缓冲区,根据需要切换它们的endian表示,然后将其作为Vec返回 这是一个函数,它获取向量并用数据填充。问题是transmute只在类型大小相同时才起作用,一个点是12个字节,transmute丢弃了其中的11个字节 fn read_points(&self, offset: u64, po

我正在试验一个API,调用方提供一个
Vec
,他们希望我用数据填充它。他们可以通过使用
和_capacity创建向量来分配空间,然后通过执行
推送(点{…})
来推送其大小。然后,我将用磁盘中的字节填充底层缓冲区,根据需要切换它们的endian表示,然后将其作为
Vec
返回

这是一个函数,它获取向量并用数据填充。问题是transmute只在类型大小相同时才起作用,一个
点是12个字节,transmute丢弃了其中的11个字节

fn read_points(&self, offset: u64, points: &mut [point::Point]) {
    let mut file = self.handle.borrow_mut();
    file.seek(SeekFrom::Start(offset)).unwrap();

    // bleep bloorp. danger!
    let points_buf : &mut [u8] = unsafe { mem::transmute(points) };
    file.read(points_buf).unwrap();

    // should take the 12 bytes and do the endian swaps
    for mut chunk in points_buf.chunks_mut(point::POINT_SIZE) {
        let point = point::buf_to_point(chunk);
        let buf : &mut [u8] = &mut chunk;
        point::fill_buf(buf, point.timestamp, point.value);
    }
}

这个API可以在Rust中完成吗?或者我应该切换到执行更安全但速度较慢的复制操作吗?

&mut[T]
的内存表示形式是
(*mut,usize)
其中usize是片中
T
元素的数量,而不是字节数。因此,转换一个片段,比如说20个点,会得到一个20字节的片段

您必须计算正确的字节数:

let n_bytes = points.len() * std::mem::size_of::<Point>();
let points_buf = std::slice::from_raw_parts_mut(points.as_mut_ptr(), n_bytes);
n_bytes=points.len()*std::mem::size_of::();
让points_buf=std::slice::from_raw_parts_mut(points.as_mut_ptr(),n_字节);

(那么当然要处理所有其他的不安全问题。)

也许你想要这样的东西?不完全是,我不想更改内存表示,而且bincode似乎没有给出我想要的就地交换。我想通过借用一个Vec作为一个Vec(两者的总大小相同)来控制如何读取endianness的值,我想在块中对Vec进行就地操作,然后返回使用数据作为一个Vec。我需要访问底层切片,就好像它是&[u8]临时操作字节顺序一样。我不知道答案,但我想知道您如何才能确保不存在填充问题—例如,由于存储原因,15字节的结构实际上被填充为16字节;每16个字节将是一块未定义的内存…对,这是一个很好的观点。我认为对齐是可以的,而且我非常确定向量的支持数组将一个接一个地存储对齐的值。此外,我可能需要强制结构的表示形式为
#[repr(C)]
,这样结构就紧凑了。这会触发新的内存分配吗?