【问题标题】:How to convert hex string to a float in Rust?如何在 Rust 中将十六进制字符串转换为浮点数?
【发布时间】:2017-09-28 00:20:21
【问题描述】:

将十六进制字符串转换为浮点数最直接的方法是什么? (不使用 3rd 方板条箱)

Rust 是否提供了与 Python 的 struct.unpack('!f', bytes.fromhex('41973333')) 等价的功能


PythonJava 请参阅此问题,供参考。

【问题讨论】:

  • 你为什么坚持不用板条箱?
  • 由于其他语言几行就可以完成,所以我想知道如何在不引入中间件的情况下进行原始操作。

标签: rust


【解决方案1】:

没有外部板条箱,这很容易:

fn main() {
    // Hex string to 4-bytes, aka. u32
    let bytes = u32::from_str_radix("41973333", 16).unwrap();

    // Reinterpret 4-bytes as f32:
    let float = unsafe { std::mem::transmute::<u32, f32>(bytes) };

    // Print 18.9
    println!("{}", float);
}

Playground link.

【讨论】:

    【解决方案2】:

    f32::from_bits 在安全代码中执行transmute。请注意,转换与 struct.unpack 不同,因为 struct.unpack 允许您指定字节顺序并具有明确定义的 IEEE 表示。

    【讨论】:

    • 字节序问题可以通过{from,to}_{be,le} 轻松解决。 f32::from_bits 还具有正确处理 NaN 值的优势。
    • @mcarton 不完全确定from_bits 更正确地处理 NaN;它只是更保守。信号 NaN 是否真的会导致不安全的行为仍在争论中。
    • @mcarton from_bits 现在完全等同于 transmutegithub.com/rust-lang/rust/pull/46012
    猜你喜欢
    • 2020-10-17
    • 2014-03-01
    • 2014-06-18
    • 2010-11-07
    • 2012-08-22
    • 2016-01-03
    • 2014-03-19
    相关资源
    最近更新 更多