Rust,如何将字节数组作为浮点数组进行切片



我在&[u8]中存储了一些字节数据,我知道切片中包含的数据是浮点数据。我想做等效的auto float_ptr = (float*)char_ptr;

我试过了:

let data_silce = &body[buffer_offset..(buffer_offset + buffer_length)] as &[f32];

但是你不允许在生锈的情况下进行这种铸造。

您需要使用不安全的Rust来将一种类型的数据解释为另一种类型。

你可以做:

let bytes = &body[buffer_offset..(buffer_offset + buffer_length)];
let len = bytes.len();
let ptr = bytes.as_ptr() as *const f32;
let floats: &[f32] = unsafe { std::slice::from_raw_parts(ptr, len / 4)};

请注意,这是未定义的行为,如果其中任何一个是真的:

  • 原始切片的大小不是4字节的倍数
  • 切片的对齐不是4字节的倍数

所有4个字节的序列都是有效的f32s,但是,对于没有该属性的类型,为了避免UB,您还需要确保所有值都有效。

使用bytemuck库;特别是CCD_ 6。下面,它只是其他答案中已经描述的不安全转换,但它使用编译时(类型(和运行时(长度和对齐(检查来确保不必担心正确检查安全条件。

let data_slice: &[f32] = bytemuck::cast_slice(
&body[buffer_offset..(buffer_offset + buffer_length)
];

请注意,如果切片的开始和结束没有对齐到4个字节,这将导致死机。Rust中没有办法避免这一要求——如果数据没有对齐,则必须将其复制到对齐的新位置。(由于您的目标是生成f32,在确保对齐的同时,最简单的方法是使用f32::from_ne_bytes()迭代,执行f32转换副本。(

最新更新