Sto scrivendo una libreria che codifica/decodifica le cose da/verso un formato binario. Parte del formato sono i numeri, che sto usando per i tipi primitivi nativi di Rust (come i8
, i64
, f32
ecc.). Esiste un modo semplice e integrato per convertire questi tipi di dati in/da binari, ovvero Convertire un f64
/i64
/ecc. in un Vec<u8>
? Allo stesso modo c'è un modo per convertire 4 u8
's (in un Vec<u8>
' s dire) in un f32
?Conversione di primitive numeriche (i32, f64, ecc.) In rappresentazioni di byte
risposta
Sfortunatamente, al momento non esiste un supporto integrato sicuro per la lettura/scrittura di primitive da/a un array di byte in Rust. Esistono diverse librerie di comunità, tuttavia, byteorder è il più utilizzato. Ti suggerisco di provarlo.
Naturalmente, si può sempre lanciare puntatori prime, così, ad esempio, è possibile trasformare in *const i64
*const i8
e quindi convertirlo in una fetta di byte appropriato &[u8]
. Tuttavia, questo è facile da sbagliare, unsafe
e dipendente dalla piattaforma, quindi dovrebbe essere utilizzato solo come ultima risorsa:
use std::mem;
use std::slice;
let i: i64 = 12345;
let ip: *const i64 = &x;
let bp: *const u8 = ip as *const _;
let bs: &[u8] = unsafe {
slice::from_raw_parts(
bp,
mem::size_of::<i64>()
)
};
std::mem::transmute
è stabile ora, anche se è unsafe
. Siamo in grado di fare qualcosa di simile:
fn main() {
let var1 = 12345678_i64;
let raw_bytes : [i8; 8] = unsafe {std::mem::transmute(var1)};
for byte in &raw_bytes {
println!("{}", byte);
}
}
Nota: Si prega di essere sicuri che la dimensione delle due variabili sono esattamente uguali.
Se il vostro obiettivo è quello di stampare i byte o li hanno in una rappresentazione str
, è sufficiente utilizzare la notazione :b
in un formato doppietta
fn main() {
println!("This is the binary of int {:b}", 4 as i32);
}
Questo stampa
This is the binary of int 100
- 1. Primitive numeriche e relativi suffissi
- 2. kilobyte Conversione, megabyte ecc per byte in R
- 3. Conversione di pandas.DataFrame in byte
- 4. Conversione di sbyte in byte
- 5. conversione di DataHandler in byte []
- 6. Conversione di array di primitive in matrici di contenitori in Java
- 7. Conversione di booleano in byte in VB.NET
- 8. conversione di byte in int in Java
- 9. Su rappresentazioni di permutazioni
- 10. StringBuilder e byte di conversione
- 11. conversione di byte in una stringa C#
- 12. Conversione di byte grezzi in audio audio
- 13. primitive-boolean To String concatenazione/conversione
- 14. correttamente Conversione NSString a CGFloat, NSInteger, ecc
- 15. conversione di array di byte per l'immagine
- 16. Conversione di array di byte in stringhe in C#
- 17. Conversione di HBitmap in array di byte in Delphi
- 18. Conversione di bytecode Java in altre rappresentazioni e linguaggi di programmazione
- 19. Come usare ScriptIntrinsicYuvToRGB (conversione di byte [] YUV a byte [] RGBA)
- 20. Conversione implicita Java di int a byte
- 21. Conversione di BitmapImage a byte array
- 22. F #: conversione di una stringa in una serie di byte
- 23. Conversione di un array di byte in PNG/JPG
- 24. C# int conversione byte
- 25. Conversione ordine byte di rete con "char"
- 26. Problemi di conversione dell'array di byte in stringa e ritorno all'array di byte
- 27. Conversione di un byte in una stringa binaria in C#
- 28. Operazioni primitive nelle prove
- 29. Perché alcune primitive hanno codici byte e altre no?
- 30. Lambda su matrici primitive
Utilizzando 'std: : slice :: from_raw_parts' è meno codice e anche contrassegnato come stabile. Ancora insicuro per gli stessi motivi, però! – bluss
@ user139873, ooh, bello, in qualche modo ho perso che tale funzione esiste. Ho aggiornato la risposta. –
'byteorder' lo risolve esattamente. Quando ho detto "integrato" avrei dovuto specificare che qualcosa da casse.io sarebbe stato sufficiente. – Rory