Una struttura di dimensioni corrette come byte copiati a zero può essere eseguita utilizzando stdlib
e una funzione generica.
Nell'esempio riportato di seguito è disponibile una funzione riutilizzabile denominata any_as_u8_slice
anziché convert_struct
, poiché questa è un'utilità per avvolgere la creazione di cast e slice.
Si noti che la domanda si pone sulla conversione , questo esempio crea una sezione di sola lettura, quindi ha il vantaggio di non dover copiare la memoria.
Ecco un esempio di lavoro in base alla domanda:
unsafe fn any_as_u8_slice<T: Sized>(p: &T) -> &[u8] {
::std::slice::from_raw_parts(
(p as *const T) as *const u8,
::std::mem::size_of::<T>(),
)
}
fn main() {
struct MyStruct {
id: u8,
data: [u8; 1024],
}
let my_struct = MyStruct { id: 0, data: [1; 1024] };
let bytes: &[u8] = unsafe { any_as_u8_slice(&my_struct) };
// tcp_stream.write(bytes);
println!("{:?}", bytes);
}
Nota 1) anche se 3rd casse del partito potrebbe essere meglio, in alcuni casi, si tratta di un'operazione così primitiva che il suo utile sapere come fare in Rust.
Nota 2) al momento della scrittura (Rust 1.15), non c'è supporto per le funzioni const
. Una volta che c'è, sarà possibile eseguire il cast in una matrice di dimensioni fisse invece di una sezione.
Nota 3) la funzione any_as_u8_slice
è contrassegnato unsafe
perché qualsiasi byte di riempimento del struct
possono essere memoria non inizializzata (dando comportamento indefinito). Se ci fosse un modo per garantire che gli argomenti di input usassero solo le strutture che erano #[repr(packed)]
, allora potrebbe essere sicuro.
In caso contrario la funzione è abbastanza sicura poiché impedisce l'overflow del buffer poiché l'output è di sola lettura, numero fisso di byte e la sua durata è legata all'input.
Se si desidera una versione che restituisce un &mut [u8]
, ciò sarebbe molto pericoloso poiché la modifica potrebbe facilmente creare dati incoerenti/corrotti.
Sembra utile nel mio caso !! Grazie per la risposta! – agatana
Vale la pena notare che questa non è una conversione diretta, mentre la codifica/decodifica utilizza un formato binario, non si tratta semplicemente dell'accesso alla memoria della struttura (che può essere vista sia come una cosa buona che una cattiva) a seconda di ciò che si desidera, sta facendo alcune conversioni. Bincode, ad esempio, fa anche la conversione endian. – ideasman42