2个不稳定版本
使用旧的Rust 2015
0.2.0 | 2017年5月2日 |
---|---|
0.1.0 | 2017年2月19日 |
#1471 in 编码
183 monthly downloads
Used in roslibrust
62KB
1.5K SLoC
Serde ROSMSG
serde_rosmsg 是一个Rust序列化库,用于序列化到 rosmsg
数据格式,该格式用于TCPROS和UDPROS。
更多详细信息,请参阅
许可协议
serde_rosmsg 在MIT许可下分发。
lib.rs
:
Serde ROSMSG
ROSMSG是一种用于ROS节点之间通信的二进制格式。
消息类型由ROS自己的 规范 定义。该规范包含有关支持的数据结构的信息。序列化通过仅以小端字节顺序写入底层二进制数据来完成。包含多个项目的字段以32位长度前缀开头,表示项目数。这适用于可变大小的数组(如向量)和字符串。序列化数据以32位数字开头,表示序列化数据的字节数,不包括该前缀。
示例
如果我们想序列化 "Rust is great!",我们需要在字符串前加上14,这是字符串的长度。然后我们需要在长度注释和字符串本身的总长度前加上18。
let rosmsg_data = to_vec(&String::from("Rust is great!")).unwrap();
assert_eq!(rosmsg_data, b"\x12\0\0\0\x0e\0\0\0Rust is great!");
let rust_data: String = from_slice(&rosmsg_data).unwrap();
assert_eq!(rust_data, "Rust is great!");
序列化使用 serde
来执行。因此,如果您想序列化自己的结构,您可以使用 serde_derive
extern crate serde_rosmsg;
#[macro_use]
extern crate serde_derive;
use serde_rosmsg::{to_vec, from_slice};
fn main() {
#[derive(Debug,Serialize,Deserialize,PartialEq)]
struct Position {
x: i16,
y: i16,
z: i16,
}
let data = Position {
x: 1025,
y: -1,
z: 5,
};
let rosmsg_data = to_vec(&data).unwrap();
assert_eq!(rosmsg_data, [6, 0, 0, 0, 1, 4, 255, 255, 5, 0]);
let rust_data: Position = from_slice(&rosmsg_data).unwrap();
assert_eq!(rust_data, data);
}
依赖关系
~3–4.5MB
~98K SLoC