2个不稳定版本

使用旧的Rust 2015

0.2.0 2017年5月2日
0.1.0 2017年2月19日

#1471 in 编码

Download history 9/week @ 2024-04-07 8/week @ 2024-04-14 6/week @ 2024-04-21 9/week @ 2024-04-28 14/week @ 2024-05-12 17/week @ 2024-05-19 11/week @ 2024-05-26 13/week @ 2024-06-02 56/week @ 2024-06-09 30/week @ 2024-06-16 56/week @ 2024-06-23 41/week @ 2024-06-30 47/week @ 2024-07-07 64/week @ 2024-07-14 23/week @ 2024-07-21

183 monthly downloads
Used in roslibrust

MIT license

62KB
1.5K SLoC

Serde ROSMSG

MIT Licensed Crates.io Build Status

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