2016-04-16 10 views

Antwort

1

Es gibt , um von einer Zeichenfolge zu konvertieren (Sie können die Basis und T kann ein beliebiger ganzzahliger Typ sein).

Um eine ganze Zahl in eine String konvertieren Sie format! verwenden können:

format!("{:x}", 42) == "2a" 
format!("{:X}", 42) == "2A" 

EDIT:

Wenn Sie zwischen u32 und [u8; 4] (zum Beispiel) konvertieren möchten Sie transmute verwenden können, Dafür ist es da.

Beachten Sie auch, dass Rust hat to_be und to_le Funktionen mit Endianess beschäftigen:

unsafe { std::mem::transmute::<u32, [u8; 4]>(42u32.to_le()) } == [42, 0, 0, 0] 
unsafe { std::mem::transmute::<u32, [u8; 4]>(42u32.to_be()) } == [0, 0, 0, 42] 
unsafe { std::mem::transmute::<[u8; 4], u32>([0, 0, 0, 42]) }.to_le() == 0x2a000000 
unsafe { std::mem::transmute::<[u8; 4], u32>([0, 0, 0, 42]) }.to_be() == 0x0000002a 
+0

Wie ich verstehe, T :: from_str_radix konvertieren von string, nicht von hex. Und "formatieren!" scheint langsam zu sein, aber ich brauche wirklich Leistung. –

+0

Was nennst du Hex? Die Basis spielt nur eine Rolle, wenn die Zahl als String dargestellt wird. Andernfalls sind '42' und' 0x2a' die gleiche ganze Zahl. – mcarton

+0

Zum Beispiel habe ich mehrere Bytes (Bytes: &[u8; 4]) und muss int (u32) daraus erhalten. –

3

A u32 4 Bytes sein, Sie kann Lage sein std::mem::transmute zu verwenden, um eine [u8; 4] als eine u32 jedoch zu interpretieren:

  • passen von Ausrichtung
  • passen sie von endianness

A keine Abhängigkeit Lösung einfach ist die Mathematik zu führen, folgende in Rob Pike's steps:

fn as_u32_be(array: &[u8; 4]) -> u32 { 
    ((array[0] as u32) << 24) + 
    ((array[1] as u32) << 16) + 
    ((array[2] as u32) << 8) + 
    ((array[3] as u32) << 0) 
} 

fn as_u32_le(array: &[u8; 4]) -> u32 { 
    ((array[0] as u32) << 0) + 
    ((array[1] as u32) << 8) + 
    ((array[2] as u32) << 16) + 
    ((array[3] as u32) << 24) 
} 

Es kompiliert unten einigermaßen effizienten Code.

Wenn Abhängigkeiten eine Option sind, ist die Verwendung der byteorder Kiste einfach.

+0

Als eine Frage des Stils würde ich '|' anstelle von '+' verwenden (und Rob Pike scheint mir zuzustimmen). – starblue

Verwandte Themen