Rust语言num库

在 Rust 中,core::num 模块是标准库中最底层的数值处理单元。由于它属于 core crate,因此在不带操作系统的底层开发(no_std)中依然可用
以下是 core::num 的核心组成与用途详述:

1. 核心任务:数值类型增强

Rust 的原生数值类型(如 u8i32f64)在 core::num 中获得了大量的关联方法。这些方法通常分为以下几类:
A. 算术安全性 (Safe Arithmetic)
为了处理数值溢出(在网络包解析中极其重要,防止攻击者利用溢出绕过检查),它提供了四种模式:
  • Checked (checked_add): 返回 Option,溢出则为 None
  • Saturating (saturating_add): 溢出时停留在最大/最小值(不会回绕)。
  • Wrapping (wrapping_add): 显式允许溢出回绕(类似 C 语言行为)。
  • Overflowing (overflowing_add): 返回结果和布尔值(是否发生溢出)。
B. 字节序转换 (Endianness) 
网络数据包通常是大端序(Big Endian),而 x86 CPU 是小端序(Little Endian)。
  • from_be_bytes / to_be_bytes: 将大端字节数组转换为数值。
  • swap_bytes: 直接翻转字节序。

2. 关键结构体:非零包装(Non-zero Wrappers)

这是 core::num 提供的内存优化黑魔法,包含 NonZeroU8NonZeroU32 等。
  • 内存优化 (Nullable Pointer Optimization):
    由于 NonZeroU32 保证永远不为 0,编译器可以利用“0”这个特殊位来代表 Option::None
    • size_of::<u32>() = 4 字节
    • size_of::<Option<u32>>() = 8 字节
    • size_of::<Option<NonZeroU32>>() = 4 字节

3. 错误处理类型

该模块定义了数值转换失败时的错误类型:
  • ParseIntError: 字符串转整数失败(如 s.parse::<u32>())。
  • TryFromIntError: 大类型转小类型导致截断时触发。

4. 常用辅助 Trait (不稳定/特殊)

  • FpCategory: 枚举浮点数的分类(NaN, 无穷大, 正常值等)。
  • Wrapping: 一个包装类,让普通的 + - 运算符默认执行回绕逻辑。

5. Demo

 
use core::num::NonZeroU32;

pub struct FlowId(NonZeroU32); // 确保流量 ID 永不为 0

fn parse_packet_len(data: &[u8]) -> Option<u32> {
    // 从网络字节流(大端)安全提取长度
    let raw_len = u32::from_be_bytes(data[0..4].try_into().ok()?);
    
    // 使用 checked 避免后续计算溢出
    raw_len.checked_add(header_size)
}

参考资料:

 

posted @ 2026-02-05 16:33  PKICA  阅读(9)  评论(0)    收藏  举报