1 个不稳定版本

0.1.0 2021 年 6 月 9 日

#10 in #索尼

MIT 许可证

31KB
662

pupper

dependency status docs.rs

索尼 PlayStation 3 PUP (PlayStation 更新包) 实现。

概述

PS3 通过名为 'PUP' 的文件格式接收软件更新。这些包实际上是 '平面' 文件系统:它们包含单个文件或 '段',但没有层次结构。

此包简化了 PUP 的创建和反序列化。

另请参阅


lib.rs:

索尼 PlayStation 3 PUP (PlayStation 更新包) 实现。

概述

PS3 通过名为 'PUP' 的文件格式接收软件更新。这些包实际上是 '平面' 文件系统:它们包含单个文件或 '段',但没有层次结构。

此包简化了 PUP 的创建和反序列化。

示例

首先创建一个新的 [Pup] 并为其分配一个映像版本

use pupper::{Pup, Segment};

let segments = Vec::<Segment>::new();
let image_version: u64 = 0xAAAA_BBBB;

let pup = Pup::new(segments.clone(), image_version);

assert_eq!(segments, pup.segments);
assert_eq!(image_version, pup.image_version);

如你所见,[Pup] 在大多数情况下是一个 POD 类型。 Pup::image_version 是一个公开的 [u64],而 Pup::segments 是透明的 [Vec<Segment>

现在创建一个段并将其添加到我们之前创建的 [Pup] 中

use pupper::SegmentId;
#

let id = SegmentId(0x100);
let data = std::fs::read("foo.txt").unwrap();

let segment = Segment::new(id, data.clone());

// Segment is (mostly) a POD type, too!
assert_eq!(id, segment.id);
assert_eq!(data, segment.data);

pup.segments.push(segment.clone());
assert_eq!(segment, pup.segments[0]);

最后,让我们序列化整个 [Pup]。然后,我们将对其进行反序列化以确认转换是无损的

use pupper::Pup;
use std::convert::TryFrom as _;
#

// Serialize the PUP.
let data = Vec::<u8>::from(&pup);

// Deserialize the PUP.
assert_eq!(Ok(pup), Pup::try_from(data.as_slice()));

依赖关系

~715KB