gpt4 book ai didi

rust - 如何使用 nom 将 u128 整数转换为 Uuid

转载 作者:行者123 更新时间:2023-12-04 23:53:35 25 4
gpt4 key购买 nike

我有一个二进制数据包,其中包含一个 UUID(16 字节)、一个 1 字节类型字段和 4 个包含浮点值的字节。

如何用 nom 解析并得到一个元组 (Uuid, u8, f32)?

use nom::{
combinator::map_res, number::complete::le_f32, number::complete::le_u128,
number::complete::le_u8, sequence::tuple, IResult,
};
use uuid;

fn detect(data: &[u8]) -> IResult<&[u8], (uuid::Uuid, u8, f32)> {
???

/* my attempt so far:
map_res(tuple((le_u128, le_u8, le_f32)), |tup| {
Ok((uuid::Uuid::from_u128(tup.0), tup.1, tup.2))
})(data)
*/
}

fn main() {
let pdu = [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 200, 65,
];

let result = detect(&pdu);
println!("{:?}", result);
}
[dependencies]
nom = "5"
uuid = "0.8"

最佳答案

在 nom 5 中,你可以使用经典的 Rust 方式,示例是 self 描述的:

use nom::combinator;
use nom::number::complete as number;

fn detect(data: &[u8]) -> nom::IResult<&[u8], (uuid::Uuid, u8, f32)> {
let (data, uuid) = combinator::map(number::le_u128, uuid::Uuid::from_u128)(data)?;
let (data, type_field) = number::le_u8(data)?;
let (data, value) = number::le_f32(data)?;

Ok((data, (uuid, type_field, value)))
}

fn main() {
let pdu = [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 200, 65,
];

let result = detect(&pdu);
println!("{:?}", result);
}

关于rust - 如何使用 nom 将 u128 整数转换为 Uuid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60668837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com