⚙️

Rust: n進数文字列を数値に変換

2022/09/25に公開

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(())
}

GitHubで編集を提案

Discussion