3个不稳定版本
0.6.0 | 2024年7月17日 |
---|---|
0.5.1 | 2024年4月11日 |
0.5.0 | 2024年3月15日 |
599 在 密码学 中排名
每月181次下载
用于 pithos
1.5MB
6.5K SLoC
Pithos库
用于创建、处理和转换Pithos文件(Pithos文件是一种针对研究数据管理(RDM)优化的对象存储文件格式)的库。
描述
该库包含一个自定义的读写组件,允许在多种输入和输出格式中动态转换数据。虽然最初专注于作为ArunaObjectStorage的后端格式使用,但其范围已经显著扩大,现在支持从/到Pithos文件的各种转换,包括
- 加密(ChaCha20-Poly1305)
- 压缩(Zstandard)
- 索引
- 元数据处理
- 将多个.pto文件打包成.tar.gz存档
指导
关于使用自定义组件GenericReadWriter
和类似组件的简短指导。对于正式的文件规范,请点击此处。
针对Pithos文件格式及其相关转换逻辑的自定义数据转换组件的通用版本。思路很简单,您通过实现这些简单的基特征和您自定义的数据转换逻辑来使用这些特征
#[async_trait::async_trait]
pub trait Transformer {
async fn process_bytes(&mut self, buf: &mut bytes::BytesMut, finished: bool) -> Result<bool>;
}
之后,实现Transformer
的结构可以在GenericReadWriter
中注册,以便在ReadWriter的读取和写入部分之间进行插拔。
示例
let file = b"This is a very very important test".to_vec();
let mut file2 = Vec::new();
// Create a new GenericReadWriter
GenericReadWriter::new_with_writer(file.as_ref(), &mut file2)
.add_transformer(ZstdEnc::new(1, false))
.add_transformer(ZstdEnc::new(2, false)) // Double compression because we can
.add_transformer(
ChaCha20Enc::new(false, b"wvwj3485nxgyq5ub9zd3e7jsrq7a92ea".to_vec()).unwrap(),
)
.add_transformer(
ChaCha20Enc::new(false, b"99wj3485nxgyq5ub9zd3e7jsrq7a92ea".to_vec()).unwrap(),
)
.add_transformer(
ChaCha20Dec::new(Some(b"99wj3485nxgyq5ub9zd3e7jsrq7a92ea".to_vec())).unwrap(),
)
.add_transformer(
ChaCha20Dec::new(Some(b"wvwj3485nxgyq5ub9zd3e7jsrq7a92ea".to_vec())).unwrap(),
)
.add_transformer(ZstdDec::new())
.add_transformer(ZstdDec::new())
.add_transformer(Filter::new(Range { from: 0, to: 3 }))
.process()
.await
.unwrap();
assert_eq!(file2, b"Thi".to_vec());
此示例从字节数组(实现AsyncRead)创建一个Vec<u8>
并将它放入另一个Vec<u8>
(实现AsynWrite)中。在这之间,可以进行自定义数据转换。
示例使用自定义填充的Zstandard压缩组件将向量压缩两次,然后使用ChaCha20-Poly1305加密结果两次。之后,所有步骤都反向进行,得到原始数据。
关于自定义实现的通知
主要逻辑围绕process_bytes函数构建。
async fn process_bytes(&mut self, buf: &mut bytes::Bytes, finished: bool, should_flush: bool) -> Result<bool>;
该想法是您的Transformer接收一个可变缓冲区,其中包含您必须转换的字节。如果您已转换(全部或通过内部缓冲区)数据,则将其放回缓冲区,以便下一个Transformer的process_bytes
方法处理。如果should_flush
为true
,则应立即刷新和清除所有内部缓冲区。
依赖关系
~16-28MB
~432K SLoC