Rust数据编码解码库dec的使用,支持高效二进制与文本格式转换的通用编解码工具

Rust数据编码解码库dec的使用,支持高效二进制与文本格式转换的通用编解码工具

rust-dec

Rust编程语言的libdecnumber绑定库。

dec

提供高级、安全的libdecnumber绑定的十进制算术库。

# Cargo.toml
[dependencies]
dec = "0.4.11"

decnumber-sys

libdecnumber的低级绑定。

# Cargo.toml
[dependencies]
decnumber-sys = "0.1.6"

完整示例代码

以下是一个使用dec库进行十进制算术操作的完整示例:

use dec::Decimal;

fn main() {
    // 创建两个Decimal数字
    let a = Decimal::from(12345);
    let b = Decimal::from_str("6789.1234").unwrap();
    
    // 加法运算
    let sum = a + b;
    println!("加法结果: {}", sum);
    
    // 减法运算
    let diff = a - b;
    println!("减法结果: {}", diff);
    
    // 乘法运算
    let product = a * b;
    println!("乘法结果: {}", product);
    
    // 除法运算
    let quotient = a / b;
    println!("除法结果: {}", quotient);
    
    // 比较操作
    if a > b {
        println!("{} 大于 {}", a, b);
    } else {
        println!("{} 小于或等于 {}", a, b);
    }
    
    // 格式化输出
    println!("格式化输出: {:.2}", b);
}

扩展示例代码

以下是一个更完整的dec库使用示例,展示了更多特性和用法:

use dec::{Decimal, DecimalError};
use std::str::FromStr;

fn main() -> Result<(), DecimalError> {
    // 从不同类型创建Decimal
    let from_i32 = Decimal::from(42);
    let from_str = Decimal::from_str("3.1415926535")?;
    let from_f64 = Decimal::try_from(2.71828)?;
    
    // 数学运算
    let sum = from_i32 + from_str;
    let product = from_str * from_f64;
    
    // 科学计算
    let sqrt = from_str.sqrt();  // 平方根
    let pow = from_f64.pow(3);   // 立方
    
    // 财务计算示例
    let principal = Decimal::from_str("10000.00")?;
    let rate = Decimal::from_str("0.05")?;  // 5%利率
    let years = Decimal::from(3);
    let amount = principal * (Decimal::from(1) + rate).pow(years);
    
    // 格式化输出
    println!("整数创建: {}", from_i32);
    println!("字符串解析: {}", from_str);
    println!("浮点数转换: {}", from_f64);
    println!("加法结果: {}", sum);
    println!("乘法结果: {}", product);
    println!("平方根: {}", sqrt);
    println!("立方: {}", pow);
    println!("三年后本息合计: {:.2}", amount);
    
    // 错误处理示例
    match Decimal::from_str("invalid") {
        Ok(d) => println!("有效数字: {}", d),
        Err(e) => println!("解析错误: {}", e),
    }
    
    Ok(())
}

安装方式

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

cargo add dec

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

dec = "0.4.11"

许可证

Apache-2.0许可证


1 回复

Rust数据编码解码库dec的使用指南

介绍

dec是一个Rust语言的通用编解码库,专注于高效地进行二进制与文本格式之间的转换。它支持多种编码格式,包括Base64、Hex、URL编码等,并提供了简单易用的API接口。

主要特性

  • 支持多种编码格式:Base64、Hex、URL编码等
  • 高性能的编码/解码实现
  • 零拷贝解码功能
  • 支持流式处理
  • 完全安全的Rust实现

安装方法

在Cargo.toml中添加依赖:

[dependencies]
dec = "0.3"

基本使用方法

Base64编码/解码

use dec::base64;

fn main() {
    // 编码
    let data = b"hello world";
    let encoded = base64::encode(data);
    println!("Base64 encoded: {}", encoded);
    
    // 解码
    let decoded = base64::decode(&encoded).unwrap();
    println!("Base64 decoded: {:?}", decoded);
}

Hex编码/解码

use dec::hex;

fn main() {
    // 编码
    let data = b"hello";
    let encoded = hex::encode_upper(data);
    println!("Hex encoded: {}", encoded);
    
    // 解码
    let decoded = hex::decode(&encoded).unwrap();
    println!("Hex decoded: {:?}", decoded);
}

URL编码/解码

use dec::url;

fn main() {
    // 编码
    let data = "hello world!";
    let encoded = url::encode(data);
    println!("URL encoded: {}", encoded);
    
    // 解码
    let decoded = url::decode(&encoded).unwrap();
    println!("URL decoded: {}", decoded);
}

高级用法

零拷贝解码

use dec::base64;

fn main() {
    let encoded = "aGVsbG8gd29ybGQ=";
    let decoded = base64::decode_to_slice(encoded, &mut vec![0; 1024]).unwrap();
    println!("Decoded without allocation: {:?}", decoded);
}

流式处理

use dec::base64::{Encoder, Decoder};
use std::io::{Read, Write};

fn main() {
    // 流式编码
    let mut encoder = Encoder::new(Vec::new());
    encoder.write_all(b"hello ").unwrap();
    encoder.write_all(b"world").unwrap();
    let encoded = encoder.finish().unwrap();
    println!("Stream encoded: {}", String::from_utf8(encoded).unwrap());
    
    // 流式解码
    let mut decoder = Decoder::new(&b"aGVsbG8gd29ybGQ="[..]);
    let mut decoded = Vec::new();
    decoder.read_to_end(&mut decoded).unwrap();
    println!("Stream decoded: {:?}", String::from_utf8(decoded).unwrap());
}

性能提示

  1. 对于已知长度的数据,预分配缓冲区可以提高性能
  2. 使用decode_to_slice避免不必要的内存分配
  3. 对于大文件处理,使用流式接口

错误处理

所有解码操作都返回Result类型,应该妥善处理可能的错误:

use dec::base64;

fn main() {
    let invalid_base64 = "aGVsbG8gd29ybGQ";
    match base64::decode(invalid_base64) {
        Ok(decoded) => println!("Decoded: {:?}", decoded),
        Err(e) => println!("Error: {}", e),
    }
}

完整示例

以下是一个综合使用dec库的完整示例,展示了多种编码格式的转换:

use dec::{base64, hex, url};
use std::io::{Read, Write};

fn main() {
    // Base64示例
    let data = b"Rust programming is fun!";
    let base64_encoded = base64::encode(data);
    println!("Base64编码结果: {}", base64_encoded);
    
    let base64_decoded = base64::decode(&base64_encoded).unwrap();
    println!("Base64解码结果: {:?}", String::from_utf8_lossy(&base64_decoded));
    
    // Hex示例
    let hex_encoded = hex::encode(data);
    println!("Hex编码结果: {}", hex_encoded);
    
    let hex_decoded = hex::decode(&hex_encoded).unwrap();
    println!("Hex解码结果: {:?}", String::from_utf8_lossy(&hex_decoded));
    
    // URL示例
    let url_data = "Rust编码/解码示例";
    let url_encoded = url::encode(url_data);
    println!("URL编码结果: {}", url_encoded);
    
    let url_decoded = url::decode(&url_encoded).unwrap();
    println!("URL解码结果: {}", url_decoded);
    
    // 高级用法示例
    // 零拷贝解码
    let mut buffer = vec![0; 256];
    let bytes_written = base64::decode_to_slice(&base64_encoded, &mut buffer).unwrap();
    println!("零拷贝解码结果: {:?}", &buffer[..bytes_written]);
    
    // 流式处理
    let mut encoder = base64::Encoder::new(Vec::new());
    encoder.write_all(b"Stream ").unwrap();
    encoder.write_all(b"processing ").unwrap();
    encoder.write_all(b"example").unwrap();
    let stream_encoded = encoder.finish().unwrap();
    println!("流式编码结果: {}", String::from_utf8_lossy(&stream_encoded));
    
    // 错误处理示例
    let invalid_data = "不是有效的Base64字符串";
    match base64::decode(invalid_data) {
        Ok(d) => println!("解码成功: {:?}", d),
        Err(e) => println!("解码错误: {}", e),
    }
}

dec库为Rust开发者提供了高效、安全的数据编码解码解决方案,适用于网络协议、数据存储、安全通信等多种场景。

回到顶部