2015-09-03 27 views
16

Piszę program Rust, który odczytuje magistralę I2C i zapisuje dane. Kiedy czytam magistralę I2C, otrzymuję wartości szesnastkowe, takie jak 0x11, 0x22, itp.Konwertowanie ciągu szesnastkowego na dziesiętny

W tej chwili mogę obsłużyć to tylko jako ciąg znaków i zapisać go tak, jak jest. Czy istnieje sposób można sparsować to w liczbę całkowitą? Czy jest jakaś funkcja wbudowana?

Odpowiedz

25

Chcesz użyć from_str_radix. Jest zaimplementowany na typach całkowitych.

use std::i64; 

fn main() { 
    let z = i64::from_str_radix("1f", 16); 
    println!("{:?}", z); 
} 

Jeśli ciągi faktycznie mają przedrostek 0x, następnie trzeba będzie przejść nad nimi. Najszybszym sposobem jest:

use std::i64; 

fn main() { 
    let raw = "0x1f"; 
    let z = i64::from_str_radix(&raw[2..], 16); 
    println!("{:?}", z); 
} 
+0

To świetnie, dzięki! Żeby wyjaśnić, "[2 ..]" jest jak pominąć pierwsze dwa spacje? (jak powyżej '0' i 'x') – tsf144

+3

@ tsf144, to krojenie składni. '& raw [2 ..]' jest podłańcuchem 'raw' zaczynającym się od drugiego bajtu' raw'. –

+0

@ tsf144 Dokładnie to, co powiedział Władimir. Ważną częścią jest to, że jest to ** bajty **. W tym przypadku wygląda na to, że masz łańcuchy zakodowane w ASCII, a więc jeden znak == jeden bajt. – Shepmaster