62

I'm writing a Rust program that reads off of an I2C bus and saves the data. When I read the I2C bus, I get hex values like 0x11, 0x22, etc.

Right now, I can only handle this as a string and save it as is. Is there a way I can parse this into an integer? Is there any built in function for it?

Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
tsf144
  • 817
  • 1
  • 8
  • 14

1 Answers1

96

In most cases, you want to parse more than one hex byte at once. In those cases, use the hex crate.

parse this into an integer

You want to use from_str_radix. It's implemented on the integer types.

use std::i64;

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

If your strings actually have the 0x prefix, then you will need to skip over them. The best way to do that is via trim_start_matches or strip_prefix:

use std::i64;

fn main() {
    let raw = "0x1f";
    let without_prefix = raw.trim_start_matches("0x");
    let z = i64::from_str_radix(without_prefix, 16);
    println!("{:?}", z);
}
Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
  • That's great, thanks! Just to clarify, the '[2..]' is how you skip the first two spaces? (like over '0' and 'x') – tsf144 Sep 03 '15 at 18:00
  • 3
    @tsf144, it is slicing syntax. `&raw[2..]` is a substring of `raw` starting at the second byte of `raw`. – Vladimir Matveev Sep 03 '15 at 18:02
  • @tsf144 Just what Vladimir said. The important part is that it is **bytes**. In this case, it looks like you have ASCII-encoded strings, so one character == one byte. – Shepmaster Sep 03 '15 at 18:28
  • Does this code fail on a 32-bit machine? You can do the same thing but replacing `i64` with `isize` so that it supports the architecture of the machine you run it on. – Jake Ireland May 01 '21 at 08:55
  • 1
    @JakeIreland no, this does not fail on a 32-bit machine. – Shepmaster May 03 '21 at 14:03
  • 1
    Note that `trim_start_matches` removes the prefix repeatedly, so that would also parse `0x0x0x1f`. You can use `strip_prefix` to remove only once, but will need to differentiate the two cases. – TheOperator Sep 04 '22 at 07:53
  • i am doing something similar with `const someConst: u32 = u32::from_str_radix("10U", 16)` i have an `expected u32, found Result` error - i've tried unwrapping it etc, does not help - how to solve this? – AthulMuralidhar Jan 31 '23 at 20:31
  • 1
    @AthulMuralidhar it's not currently possible to call trait methods for compile-time values, so there is no direct solution. – Shepmaster Apr 14 '23 at 21:18