Rust语言num库
在 Rust 中,
core::num 模块是标准库中最底层的数值处理单元。由于它属于 core crate,因此在不带操作系统的底层开发(no_std)中依然可用。以下是
core::num 的核心组成与用途详述:1. 核心任务:数值类型增强
Rust 的原生数值类型(如
u8, i32, f64)在 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 提供的内存优化黑魔法,包含 NonZeroU8、NonZeroU32 等。- 内存优化 (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)
}
参考资料:
浙公网安备 33010602011771号