这是一个基于Rust实现的字节流结构化序列化/反序列化通用库,可以应用于网络数据包解析、网络数据包组包、网络通信、文件内容解析等,觉得不错的小伙伴们请点个赞👍~
[dependencies]
jbytes = { version="0.2.0", features = ["derive"] }
no_std:
[dependencies]
jbytes = { version="0.2.0", default-features = false, features = ["derive"] } # default use alloc.
use jbytes::prelude::*;
fn main() {
let bytes = Bytes::new(b"\x01\x02\x03");
assert_eq!(bytes.take_be_u16(), Ok(0x0102));
assert_eq!(bytes.take_be_u16().is_err(), true);
}
use jbytes::prelude::*;
fn buffer_example(buffer: &mut Buffer) -> JResult<()> {
buffer.push_be_u16(1)?;
buffer.push(b"\x01\x02\x03")?;
Ok(())
}
fn main() {
let mut buffer = Buffer::new();
if buffer_example(&mut buffer).is_ok() {
assert_eq!(*buffer, b"\x00\x01\x01\x02\x03");
}
}
use jbytes::{ByteEncode, ByteDecode};
use jbytes::prelude::*;
#[derive(Debug, PartialEq, Eq, ByteEncode, ByteDecode)]
pub struct SimpleExample {
pub length: u16,
// 这里是指定动态长度,也可以指定固定数值,比如:`#[jbytes(length=3)]`
// 还可以不指定`length`, 指定`byte_count=<1..8>`表示提前取走几个字节根据字节序转为长度数值
#[jbytes(length="length")]
pub value: String,
pub cmd: u8,
// 这里指定了branch, 表示根据cmd的值进行枚举类型(enum)模式匹配, 同样也可以不指定branch, 指定`byte_count=<1..8>`修饰符
#[jbytes(branch="cmd")]
pub body: SimpleExampleBody,
}
#[derive(Debug, PartialEq, Eq, ByteEncode, ByteDecode)]
pub enum SimpleExampleBody {
#[jbytes(branch_value=1)]
Read {
address: u8,
}, // 这里表示当前面的`cmd`字段为1,则会进入该分支解析
Write {
address: u8,
value: [u8; 3],
}, // 这里如果不指定,默认是递增的关系为2
#[jbytes(branch_default)]
Unknown, // 这里由于指定了默认分支,所以会被映射为`_ => { ... }`, 如果没有指定,Unknown序号为3,其他则会返回解析错误
}
fn main() -> JResult<()> {
let input = b"\x00\x03\x31\x32\x33\x01\x05";
let value: SimpleExample = jbytes::decode(input)?;
assert_eq!(value, SimpleExample { length: 3, value: "123".to_string(), cmd: 1, body: SimpleExampleBody::Read { address: 5 } });
assert_eq!(*jbytes::encode(value)?, input);
}
[dependencies]
jbytes = { version="0.2.0", features = ["derive", "jdefault"] }
use jbytes::{ByteEncode, ByteDecode, Jdefault};
use jbytes::prelude::*;
#[derive(Debug, PartialEq, Eq, ByteEncode, ByteDecode, Jdefault)]
pub struct SimpleExample {
#[jbytes(byte_count=1, default="\"123\".to_string()")]
pub value: String,
#[jbytes(byte_count=1)]
pub body: SimpleExampleBody,
}
#[derive(Debug, PartialEq, Eq, ByteEncode, ByteDecode, Jdefault)]
pub enum SimpleExampleBody {
#[jbytes(branch_value=1)]
Read {
address: u8,
},
Write {
address: u8,
value: [u8; 3],
},
#[jbytes(branch_default)]
Unknown {
#[jbytes(default=10)]
value: u8,
},
}
fn main() -> JResult<()> {
let value = SimpleExample::default();
assert_eq!(value, SimpleExample {
value: "123".to_string(),
body: SimpleExampleBody::Unknown { value: 10 },
});
assert_eq!(*jbytes::encode(value)?, b"\x03\x31\x32\x33\x03\x0a");
let value: SimpleExample = jbytes::decode(b"\x03\x31\x32\x33\x03\x0a")?;
assert_eq!(value, SimpleExample {
value: "123".to_string(),
body: SimpleExampleBody::Unknown { value: 10 },
});
}
-
u8/u16/u32/u64/usize/u128
-
i8/i16/i32/i64/isize/i128
-
bool
-
char
-
f32/f64
-
String
-
&str
-
&[u8]
-
array[T; N]
-
tuple
-
Vec<T>
-
Option<T>
-
Struct
-
Enum
-
PhantomData
-
HashMap
-
HashSet
-
MacAddress
-
std::net::Ipv4Addr
-
std::net::Ipv6Addr
-
std::net::IpAddr
-
NetAddress
-
HexString
-
DateTime
-
Bit
主要用于修饰某个struct/enum全局定义,表示struct/enum里面的字段都遵循,也可以通过FieldAttrModifiers
修饰单个内容。
通用修饰符
-
byteorder=<"BE"|"LE">
: 表示字节序,BE(大端字节序)/LE(小端字节序),eg: byteorder example。 -
encode_with=<func>
: 自定义encode函数,eg: encode_with example。 -
decode_with=<func>
: 自定义decode函数,eg: decode_with example。 -
with=<mod>
: 自定义encode/decode函数,eg: with example。 -
get_variable_name=<variable>
: 获取缓存变量, 必须配合variable_name
使用,可以用于不同struct或enum类型传递, eg: variable_name_example。
枚举(Enum)类型修饰符
-
byte_count_disable
: 禁用默认读取1个字节,实现match匹配枚举分支。 -
branch_enum
主要用于修饰struct/enum里面某个字段内容
-
byteorder=<"BE"|"LE"|variable(BE=0,LE=1)>
: 表示字节序,BE(大端字节序)/LE(小端字节序),eg: byteorder example。 -
length=<num|variable>
: 表示读取数据的长度,支持int/&str/String/&[u8]/Vec
类型,eg: length example。 -
offset=<num|variable>
: 表示从当前位置向前前进n个位置,实现数据流的位置偏移,eg: offset example。 -
full=<int>
: 表示用于encode
编码填充值, 默认为0, 常常用于offset偏移之后进行encode
编码填充, eg: full example。 -
byte_count=<1..8>
: 表示取几个字节转成整型,代表后续需要读取的字节流长度,eg:byte_count example。 -
remaining
: 表示取走剩余所有字节,eg:remaining example。 -
untake
: 表示读取数据不移动位置,后续可以继续从该位置读取数据,eg: untake example。 -
encode_value=<expr>
: value处理表达式,eg: encode_value example。 -
decode_value=<expr>
: value处理表达式,eg: decode_value example。 -
variable_name=<variable>
: 指定整型类型缓存变量,并通过get_variable_name
修饰符在其他Struct/Enum
使用,eg: variable_name example。 -
skip
: 表示跳过该字段的encode/decode
函数,类型需要实现Default
trait,eg:skip example。 -
skip_encode
: 表示跳过该字段的encode
函数,eg:skip_encode example。 -
skip_decode
: 表示跳过该字段的decode
函数,类型需要实现Default
trait,eg:skip_decode example。 -
if_expr=<bool expr>
: 指定if
条件表达式,支持Option<T>
类型,eg: if_expr example。 -
encode_with=<func>
: 自定义encode函数,eg: encode_with example。 -
decode_with=<func>
: 自定义decode函数,eg: decode_with example。 -
with=<mod>
: 自定义encode/decode函数,eg: with example。 -
with_args=<variable>
: 自定义encode/decode函数参数,eg: with_args example。 -
linend|end_with=<string|bytes>
:指定结束位置,支持String/&str/&[u8]/HashMap
等类型,eg:linend。 -
key|starts_with
:指定精准匹配关键字,必须配合linend
使用,支持string/&str/&[u8]
等类型,eg:key example。 -
split
: 指定分隔符, 常常用于Key: Value
这种内容, 支持HashMap
类型, eg: split example -
from_str
: 表示通过FromStr
类型进行转换,eg:from_str example。 -
from_str=<type>
:表示通过Type::FromStr
类型进行转换,eg:from_str example。 -
check_value
:主要用于检查结果是否正常,如果异常会返回错误,eg:check_value example。
容器类型修饰符,比如:Vec/HashMap/HashSet等
-
count=<num|variable>
: 表示容器元素数量,支持Vec/HashMap/HashSet
类型,eg:count example。 -
try_count=<num|variable>
: 表示容器元素数量, 如果不足,不会返回解析错误,支持Vec/HashMap/HashSet
类型,eg:try_count example。 -
byte_count_outside=<1..8>
:表示容器元素数量,类似byte_count
,该修饰符应用Vec/HashMap/HashSet
等类型,eg:byte_count_outside example。
enum branch
-
branch
: 指定枚举(Enum)类型分支条件,eg: branch example。 -
branch_value
: 指定枚举(Enum)分支判断条件, eg: branch_value example。 -
branch_range
: 指定枚举(Enum)分支判断条件范围, eg: branch_range example。 -
branch_bits
: 指定枚举(Enum)分支判断条件, eg: branch_bits example。 -
branch_default
: 指定枚举(Enum)类型默认值, eg: branch_default example。