5 个版本 (3 个重大更新)
0.4.1 | 2023年10月16日 |
---|---|
0.4.0 | 2023年8月4日 |
0.3.0 | 2023年1月7日 |
0.2.0 | 2021年12月8日 |
0.1.0 | 2021年8月23日 |
#1029 在 编码
每月114次下载
在 7 个crate中使用 (通过 bc-ur)
105KB
2K SLoC
Rust统一资源
ur
是一个crate,用于与二进制数据的“统一资源”编码进行交互。编码方案针对通过URI和QR码传输进行了优化。
ur::Encoder
允许字节有效载荷分多个阶段传输,同时遵守最大大小要求。底层使用 fountain
编码器创建一个无界流URI,接收方可以将其重新组合成有效载荷
let data = String::from("Ten chars!").repeat(10);
let max_length = 5;
let mut encoder = ur::Encoder::bytes(data.as_bytes(), max_length).unwrap();
let part = encoder.next_part().unwrap();
assert_eq!(
part,
"ur:bytes/1-20/lpadbbcsiecyvdidatkpfeghihjtcxiabdfevlms"
);
let mut decoder = ur::Decoder::default();
while !decoder.complete() {
let part = encoder.next_part().unwrap();
// Simulate some communication loss
if encoder.current_index() & 1 > 0 {
decoder.receive(&part).unwrap();
}
}
assert_eq!(decoder.message().unwrap().as_deref(), Some(data.as_bytes()));
以下有用的构建块也是公共API的一部分
crate::bytewords
模块包含将字节有效载荷编码到合适字母表的功能,实现每字符十六进制字节效率。crate::fountain
模块提供了一个喷泉编码器的实现,它将字节有效载荷分割成多个部分,并生成一个无界的部分流,接收方可以在解码器端重新组合。
使用方法
将 ur
添加到您的 Cargo.toml
的依赖项中
cargo add ur
示例
动画QR码
要运行此示例,请执行
cargo run --example qr -- "This is my super awesome UR payload"
这将打印出传输提供有效载荷的URI和QR码。
背景:统一资源
统一资源 是
提出了一种编码任意内容和长度的二进制数据的方法,使其适用于通过URI或QR码传输。
对允许的编码字母表的结果约束进行了很好的分析这里。
以下构建块相互作用以实现这一目标
- Bytewords将二进制数据映射到不区分大小写的字符,效率为4位/字符(与十六进制编码相同)
- 基于Luby转换(一种特定的喷泉编码),构建用于传输多部分消息的片段,这些片段的子集可以恢复原始消息
- CBOR允许自描述的字节有效载荷
- 正确初始化的Xoshiro伪随机生成器允许编码和解码方就哪些消息部分被组合到喷泉编码片段中达成一致
其他实现
这个Rust实现,特别是其测试向量,基于以下参考实现
贡献
欢迎提交拉取请求。
许可证
本项目根据MIT许可证的条款进行许可。
依赖关系
~2.5MB
~55K SLoC