目的
在Rust中读取其他系统(C )生产的Protouf格式的数据文件。
- rust 1.58
- tonic
- prost
Cargo.toml
代码语言:txt复制[dependencies]
tonic = "0.7.2"
prost = "0.10"
[build-dependencies]
tonic-build = {version="0.7.2", features=["prost", "compression"]}
project tree
代码语言:txt复制├── Cargo.lock
├── Cargo.toml
├── build.rs
├── proto
│ ├── dsystemtopo.proto
│ └── test.proto
├── src
│ └── main.rs
├── system.bin
└── target
├── CACHEDIR.TAG
└── debug
build.rs 用于编译Protobuf文件
代码语言:txt复制extern crate tonic_build;
fn main() {
tonic_build::configure()
.compile(
&["/root/test-tonic/proto/test.proto"],
&["/root/test-tonic/proto"],
)
.unwrap();
tonic_build::configure()
.compile(
&["/root/test-tonic/proto/dsystemtopo.proto"],
&["/root/test-tonic/proto"],
)
.unwrap();
}
main.rs 测试
代码语言:txt复制 extern crate prost;
use std::io::Read;
pub mod test {
tonic::include_proto!("test2");
}
pub mod model {
tonic::include_proto!("zdpower");
}
use prost::Message;
use model::PCalcSystem;
use model::*;
fn main() {
// 读取C Protobuf格式二进制数据
let mut stream = std::fs::OpenOptions::new()
.read(true)
.open("system.bin")
.expect("read fail.");
let mut data: Vec<u8> = Vec::new();
stream.read_to_end(&mut data);
// 解码
let psystem: PCalcSystem = Message::decode(&*data).expect("decode fail!");
println!("nodes:{}", psystem.system_nodes.len());
// 编码
let mut encode_data: Vec<u8> = Vec::new();
psystem.encode(&mut encode_data);
println!("encode_size:{}", encode_data.len());
}