Umwandlung von Zahl-primitive (i32, f64, etc) - byte-Darstellungen
Ich Schreibe eine Bibliothek, kodiert/dekodiert die Daten zu/von einem binären format. Teil des formats ist zahlen, ich bin mit Rost native primitive Typen für die (wie i8
, i64
, f32
etc.).
Gibt es eine einfache, integrierte Möglichkeit zur Konvertierung von Datentypen in/aus Binär, d.h. konvertieren f64
/f32
/i64
/etc. in einem Vec<u8>
? Ebenso ist es ein Weg, um zu konvertieren 4 u8
s (in einem Vec<u8>
sagen) in eine f32
?
- Bitte, können Sie markieren Sie den Nikolaus Rishel ' s Antwort als angenommen? Das ist die kanonische Antwort nun, und die ältesten mit
transmute
Beispiele können irreführend sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider gibt es keine sichere integrierte Unterstützung für das Lesen/schreiben von primitiven aus/ein byte-array in Rust im moment. Es gibt mehrere community-Bibliotheken für, die, jedoch, byteorder, die am meisten verwendet man:
Natürlich, Sie können immer wirken raw-Pointer. Zum Beispiel, können Sie
*const i64
in*const i8
und dann konvertieren Sie Sie in ein geeignetes byte-slice&[u8]
. Dies ist jedoch leicht zu bekommen, falsch,unsafe
-und Plattform-abhängige aufgrund endiannness, so sollte es nur verwendet werden, als eine Letzte resort:std::slice::from_raw_parts
ist weniger code und auch als stabil gekennzeichnet. Immer noch unsicher, aus den gleichen Gründen, obwohl!byteorder
löst es genau. Wenn ich sagte, "Baujahr", ich sollte angegeben haben, dass etwas aus der Kiste.io würde ausreichen.Als der Rost 1.32 können Sie
{to,from}_{ne,le,be}_bytes
für Integrale Typen.Für floating-point haben Sie immer noch angewiesen auf Methoden vor.
std::mem::transmute
können verwendet werden, obwohl esunsafe
:Hinweis: Sie Bitte sicher, dass die Größe der beiden Variablen genau gleich.
std::mem::size_of::<i64>()
statt8
im array[u8; 8]
(odermem::size_of
wie vorgeschlagen) und wenn die Größen nicht übereinstimmen,transmute
wird nicht funktionieren: "kann nicht umwandeln zwischen verschiedenen Arten in verschiedenen Größen, abhängig oder-sized types" so ist es "irgendwie sicher".Gebäude aus der Nicholas Rishel ' s Antwort.
Rost 1.32 hat:
{an,aus}_{ne,le,be}_bytes
,to_bits
, undfrom_bits
.Konvertieren einer Ganzzahl in bytes dann wieder:
Umwandlung einer float-bytes dann wieder:
Entsprechend der Rost Dokumentation
from_bits
können portabilitätsprobleme.Wenn Ihr Ziel ist, drucken Sie die bytes oder haben Sie in einer
str
Darstellung, verwenden Sie einfach die:b
notation in einem format KlammerDiese Drucke
This is the binary of int 100