⚙️
Rust: n進数文字列を数値に変換
Rustで16進数文字列を数値に変換する記事がなかなか見つからなかったので、最も簡単な方法を紹介します。本記事では16進数文字列の例を示していますが、2進数文字列も引数の設定によって変換可能です。
unsigned
from_str_radix
というメソッドを使用します。
第一引数に変換したい文字列、第二引数に基数を渡します。
文字が16進数の場合は16
を、2進数の場合は2
を指定します。
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
let hex_8bit = "FF";
assert_eq!(255 , u8::from_str_radix(hex_8bit, 16)?);
let hex_16bit = "FFFF";
assert_eq!(65535, u16::from_str_radix(hex_16bit, 16)?);
let hex_32bit = "FFFFFFFF";
assert_eq!(4294967295, u32::from_str_radix(hex_32bit, 16)?);
let hex_64bit = "FFFFFFFFFFFFFFFF";
assert_eq!(18446744073709551615 , u64::from_str_radix(hex_64bit, 16)?);
Ok(())
}
signed
signed
の場合は、上記の通りunsigned
に変換した後、as
でキャストします。
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
let hex_8bit = "FF";
assert_eq!(-1 , u8::from_str_radix(hex_8bit, 16)? as i8);
let hex_16bit = "FFFF";
assert_eq!(-1, u16::from_str_radix(hex_16bit, 16)? as i16);
let hex_32bit = "FFFFFFFF";
assert_eq!(-1 , u32::from_str_radix(hex_32bit, 16)? as i32);
let hex_64bit = "FFFFFFFFFFFFFFFF";
assert_eq!(-1 , u64::from_str_radix(hex_64bit, 16)? as i64);
Ok(())
}
float
float
の場合は、上記の通りunsigned
に変換した後、from_bits
というメソッドを使用します。
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
let hex_32bit = "437F0000";
assert_eq!(255.0, f32::from_bits(u32::from_str_radix(hex_32bit, 16)?));
let hex_64bit = "406FE00000000000";
assert_eq!(255.0, f64::from_bits(u64::from_str_radix(hex_64bit, 16)?));
Ok(())
}
Discussion