Rust字节大小处理库re_byte_size的使用,高效解析和转换文件/内存字节大小的实用工具

Rust字节大小处理库re_byte_size的使用,高效解析和转换文件/内存字节大小的实用工具

re_byte_size是rerun系列crate的一部分,用于在运行时计算值的堆分配大小。

安装

在项目目录中运行以下Cargo命令:

cargo add re_byte_size

或者在Cargo.toml中添加以下行:

re_byte_size = "0.24.1"

许可证

MIT 或 Apache-2.0

基本使用示例

以下是使用re_byte_size库的基本示例:

use re_byte_size::ByteSize;

fn main() {
    // 从原始字节数创建ByteSize
    let size = ByteSize::from_bytes(1024);
    println!("Size in bytes: {}", size.bytes());
    
    // 自动选择合适单位显示
    println!("Human readable: {}", size);
    
    // 从不同单位创建
    let size_kb = ByteSize::from_kb(1.5);
    let size_mb = ByteSize::from_mb(2.0);
    
    // 单位转换
    println!("1.5 KB = {} bytes", size_kb.bytes());
    println!("2 MB = {} KB", size_mb.as_kb());
    
    // 算术运算
    let total = size_kb + size_mb;
    println!("Total size: {}", total);
    
    // 解析字符串
    let parsed = "1.5 MB".parse::<ByteSize>().unwrap();
    println!("Parsed size: {} bytes", parsed.bytes());
}

高级用法示例

use re_byte_size::ByteSize;
use std::mem;

struct SampleData {
    id: u64,
    name: String,
    values: Vec<f64>,
}

fn main() {
    // 计算结构体的堆分配大小
    let data = SampleData {
        id: 42,
        name: "Test".to_string(),
        values: vec![1.0, 2.0, 3.0],
    };
    
    // 计算字符串大小
    let name_size = ByteSize::from_bytes(data.name.capacity());
    
    // 计算向量大小
    let vec_size = ByteSize::from_bytes(data.values.capacity() * mem::size_of::<f64>());
    
    // 总堆大小
    let total_heap = name_size + vec_size;
    println!("Total heap size: {}", total_heap);
    
    // 格式化选项
    println!("Compact: {:.2}", total_heap);
    println!("Full precision: {:.6}", total_heap);
    
    // 比较大小
    let limit = ByteSize::from_mb(1);
    if total_heap > limit {
        println!("Warning: Exceeded 1 MB limit!");
    }
}

完整示例demo

use re_byte_size::ByteSize;
use std::mem;

// 自定义数据结构示例
struct MemoryUsage {
    buffer: Vec<u8>,
    description: String,
    metadata: Vec<String>,
}

fn main() {
    // 示例1: 基本单位转换和显示
    println!("--- 基本单位转换示例 ---");
    let file_size = ByteSize::from_mb(5.5);
    println!("文件大小: {}", file_size);
    println!("精确字节数: {}", file_size.bytes());
    println!("转换为KB: {:.2}", file_size.as_kb());
    
    // 示例2: 从字符串解析
    println!("\n--- 字符串解析示例 ---");
    let config_size = "256 KB".parse::<ByteSize>().unwrap();
    println!("配置大小: {}", config_size);
    println!("是否大于200KB? {}", config_size > ByteSize::from_kb(200.0));
    
    // 示例3: 计算自定义结构的内存使用
    println!("\n--- 内存使用计算示例 ---");
    let usage = MemoryUsage {
        buffer: vec![0; 1024 * 1024], // 1MB缓冲区
        description: "这是一个内存使用示例".to_string(),
        metadata: vec!["tag1".to_string(), "tag2".to_string()],
    };
    
    // 计算各部分内存使用
    let buffer_size = ByteSize::from_bytes(usage.buffer.capacity());
    let desc_size = ByteSize::from_bytes(usage.description.capacity());
    let meta_size = ByteSize::from_bytes(
        usage.metadata.capacity() * mem::size_of::<String>() + 
        usage.metadata.iter().map(|s| s.capacity()).sum::<usize>()
    );
    
    // 总内存使用
    let total = buffer_size + desc_size + meta_size;
    println!("总内存使用: {}", total);
    println!("详细分解:");
    println!("- 缓冲区: {}", buffer_size);
    println!("- 描述: {}", desc_size);
    println!("- 元数据: {}", meta_size);
    
    // 示例4: 内存限制检查
    println!("\n--- 内存限制检查示例 ---");
    let memory_limit = ByteSize::from_mb(2);
    if total > memory_limit {
        println!("错误: 内存使用超过{}限制!", memory_limit);
    } else {
        println!("内存使用在安全范围内");
    }
    
    // 示例5: 格式化选项
    println!("\n--- 格式化选项示例 ---");
    println!("默认格式: {}", total);
    println!("两位小数: {:.2}", total);
    println!("完整精度: {:.6}", total);
    println!("强制使用MB显示: {} MB", total.as_mb());
}

特性

  • 支持各种单位(字节、KB、MB、GB等)的转换和计算
  • 自动选择最合适的单位进行显示
  • 精确的浮点数运算
  • 支持从字符串解析
  • 轻量级,无额外依赖

这个库特别适合需要监控内存使用情况、报告文件大小或进行资源限制的应用程序。通过简单的API,可以轻松地将原始字节数转换为人类可读的格式,或进行各种单位间的转换计算。


1 回复

Rust字节大小处理库re_byte_size使用指南

以下是基于提供内容的完整示例demo,展示了re_byte_size库的主要功能:

use re_byte_size::{ByteSize, ParseError};
use std::fs;

fn main() {
    // 示例1: 基本解析
    println!("=== 基本解析示例 ===");
    let size1 = ByteSize::from_str("1.5 KB").unwrap();
    let size2 = ByteSize::from_str("2GiB").unwrap();
    let size3 = ByteSize::b(1024);
    let size4 = ByteSize::kb(1.5);
    
    println!("Size1: {}", size1); // 输出: 1.5 KB
    println!("Size2: {}", size2); // 输出: 2 GiB
    println!("Size3: {}", size3); // 输出: 1 KB
    println!("Size4: {}", size4); // 输出: 1.5 KB

    // 示例2: 比较和运算
    println!("\n=== 比较和运算示例 ===");
    let size5 = ByteSize::mb(2);
    let size6 = ByteSize::gb(0.002);
    
    println!("相等比较: {}", size5 == size6); // true
    println!("大小比较: {}", size5 > ByteSize::mb(1)); // true
    
    let sum = size5 + size6;
    println!("求和: {}", sum); // 输出: 4 MB
    
    let diff = size5 - size6;
    println!("求差: {}", diff); // 输出: 0 bytes

    // 示例3: 单位转换
    println!("\n=== 单位转换示例 ===");
    println!("{} = {} bytes", size5, size5.as_u64());
    println!("{} = {:.2} KB", size5, size5.as_kb());
    println!("{} = {} MB", size5, size5.as_mb());

    // 示例4: 格式化输出
    println!("\n=== 格式化输出示例 ===");
    let size7 = ByteSize::gb(1.5);
    println!("默认格式: {}", size7);
    println!("2位小数: {:.2}", size7);
    println!("二进制单位: {:b}", size7); // 输出: 1.5 GiB
    println!("十进制单位: {:d}", size7); // 输出: 1.5 GB

    // 示例5: 自定义解析
    println!("\n=== 自定义解析示例 ===");
    match parse_user_input(" 1,024 KB ") {
        Ok(size) => println!("解析结果: {}", size),
        Err(e) => println!("解析错误: {}", e),
    }

    // 示例6: 文件系统使用
    println!("\n=== 文件系统示例 ===");
    if let Ok(metadata) = fs::metadata("Cargo.toml") {
        let file_size = ByteSize::b(metadata.len());
        println!("文件大小: {}", file_size);
        println!("大于1KB? {}", file_size > ByteSize::kb(1));
    } else {
        println!("找不到Cargo.toml文件");
    }
}

fn parse_user_input(input: &str) -> Result<ByteSize, ParseError> {
    // 自定义预处理:去除空格和逗号
    let cleaned = input.trim().replace(",", "");
    ByteSize::from_str(&cleaned)
}

这个完整示例演示了:

  1. 从字符串和数值创建ByteSize实例
  2. 字节大小的比较和数学运算
  3. 不同单位间的转换
  4. 多种格式化输出选项
  5. 自定义解析逻辑
  6. 实际文件系统应用

要运行此示例,请确保已在Cargo.toml中添加依赖:

[dependencies]
re_byte_size = "1.0"
回到顶部