1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use std::{
    borrow::BorrowMut,
    mem::{size_of, zeroed},
};

pub fn to_bytes<T>(val: &T) -> Vec<u8> {
    let mut result = vec![];
    let mut ptr = val as *const T as *const u8;
    for _ in 0..size_of::<T>() {
        unsafe {
            result.push(*ptr);
            ptr = ptr.add(1);
        }
    }

    result
}

pub fn from_bytes<T>(bytes: &[u8]) -> T {
    if bytes.len() != size_of::<T>() {
        panic!();
    }

    let mut val: T = unsafe { zeroed() };
    let mut ptr = val.borrow_mut() as *mut T as *mut u8;

    for byte in bytes {
        unsafe {
            *ptr = *byte;
            ptr = ptr.add(1);
        }
    }

    val
}