Я пытаюсь максимально оптимизировать операцию, выполняемую над срезами u32
из массивов u8
. Таким образом, я тестирую различные варианты (для циклов, итераторов, использования контейнера ByteOrder и т. д.). В рамках этих тестов я также хотел проверить, могу ли я улучшить его, используя стандартную функцию from_raw_parts
. Вот мой код:
use byteorder::{ByteOrder, BigEndian, LittleEndian};
use std::io::Read;
fn main(){
let random_bytes = (0..4).map(|_| { rand::random::<u8>() }).collect::<Vec<u8>>();
let random_bytes = random_bytes.as_slice();
let view = &random_bytes as *const _ as *const u32;
let slice: &[u32] = unsafe { std::slice::from_raw_parts(view, 1) };
println!("{:x?}", slice);
println!("{:x?}", LittleEndian::read_u32(&random_bytes[0..4]));
println!("{:x?}", BigEndian::read_u32(&random_bytes[0..4]));
println!("{:x?}", &random_bytes[0..4]);
}
Я бы ожидал, что по крайней мере один из двух байтов Little или Big endian будет равен первому отпечатку, но вместо этого это не так, например. пример вывода
[d951db30]
143600ff
ff003614
[ff, 0, 36, 14]
Что я делаю не так?