Crates.io | hcproto |
lib.rs | hcproto |
version | 0.1.3 |
source | src |
created_at | 2024-12-11 08:45:13.479557 |
updated_at | 2024-12-12 03:28:13.992162 |
description | net for Rust |
homepage | |
repository | https://github.com/hcengine/hcproto |
max_upload_size | |
id | 1479768 |
size | 2,284,153 |
simple binary proto 一种对标JSON的二进制数据协议, 支持JSON的所有类型的动态组合
基本支持的类型 "u8", "i8", "u16", "i16", "u32", "i32", "u64", "i64", "varint", "f32", "f64", "string", "raw", "array", "map"
如果是正数则*2, 如果是负数则-(x + 1) * 2, 相当于0->0, -1->1, 1->2,-2->3,2->4来做处理, 因为是小子节的数比较多, 每bit里的第一位则表示是否是最后一位, 如果10000001, 则表示还要继续往下读如果是00000001则表示这是最后一位
相对protobuf, 无需预先定义任何的数据格式, 更好的适应多变的场景, 或者客户端不好更新的情况, 拥有更好的自适应性, 简单开封即用, 和JSON一样, 在可支持的数据类型里, 可以自由的进行转换
可以把这个看做是二进制的JSON格式, 有更好的压缩率和更快的解析速度
use algorithm::buf::Bt;
use hcproto::{Buffer, Value};
use std::time::SystemTime;
mod test_data;
use std::collections::HashMap;
fn test_level4_json() {
let mut now = SystemTime::now();
let parsed = test_data::get_json();
println!("解析JSON用时 = {:?}", now.elapsed());
now = SystemTime::now();
// println!("ok!!! parsed= {:?}", parsed);
let mut buffer = Buffer::new();
hcproto::encode_proto(&mut buffer, &"cmd_level4_full".to_string(), vec![parsed]).unwrap();
println!(
"用tunm_proto压缩test_level4_json的长度 = {}k",
buffer.remaining() / 1024
);
println!("压缩JSON耗时 = {:?}", now.elapsed());
now = SystemTime::now();
let read = hcproto::decode_proto(&mut buffer).unwrap();
println!("解析buffer耗时 = {:?}", now.elapsed());
match read {
(name, _val) => {
assert_eq!(name, "cmd_level4_full".to_string());
// println!("value === {:?}", val);
}
}
}
数据协议分为三部分(协议名称, 字符串索引区, 数据区(默认为数组)) 如数据协议名为cmd_test_op, 数据为["tunm_proto", {"name": "tunm_proto", "tunm_proto": 1}]
测试打印的结果 用完整的level-full4.json
解析JSON用时 = Ok(3.104869s)
用tunm_proto压缩test_level4_json的长度 = 370k
压缩JSON耗时 = Ok(22.2712ms)
解析buffer耗时 = Ok(16.9738ms)
普通文本的长度 = 90
解析速度约为JSON的68倍, 符合预期, 大小为明文的0.16倍, 符合压缩比