存档数据格式.md 5.6 KB

Lanzainc 存档数据格式

出于对 Lanzainc 系列产品的联动、兼容及其它功能的考虑,现设计在系列范围内通用的存档封装

下文中,Lanzainc 存档数据格式 统一简称为 LSD

概述

LSD 采用和 PNG 文件相同的结构,以 PNG 数据块为基础组成部分,即:

名称 设计尺寸 说明
PNG 标识符 8 字节 89 50 4E 47 0D 0A 1A 0A
PNG 数据块 不定长 任意数据块,可以是图像数据,也可以是自定义数据
…… …… ……
PNG 结尾块 12 字节 标识为 IEND 的数据块,不持有实际数据

数据块结构

顺位 名称 设计尺寸 说明
1 长度(大端序) 4 字节 该数据块中存储实际数据的长度
2 类型 4 字节 4 字节长的 ASCII 字符组,标识该数据块的类型
3 实际数据 不定长 该数据块中存储的实际数据
4 CRC(大端序) 4 字节 校验值

数据块类型

现存有意义的数据块类型

下列的数据块类型,在当前 PNG 结构中很常见,并发挥一定的作用;

它们不会(也不应)影响 LSD 的行为,在读写时保持其原样存在即可

类型 说明 数目 位置
IHDR 文件头数据块 1 个 第一块
cHRM 基色和白色点数据块 至多 1 个 PLTEIDAT 之前
gAMA 图像 γ 数据块 至多 1 个 PLTEIDAT 之前
sBIT 样本有效位数据块 至多 1 个 PLTEIDAT 之前
PLTE 调色板数据块 至多 1 个 IDAT 之前
bKGD 背景颜色数据块 至多 1 个 PLTE 之后;IDAT 之前
hIST 图像直方图数据块 至多 1 个 PLTE 之后;IDAT 之前
tRNS 图像透明数据块 至多 1 个 PLTE 之后;IDAT 之前
oFFs (专用公共数据块) 至多 1 个 IDAT 之前
pHYs 物理像素尺寸数据块 至多 1 个 IDAT 之前
sCAL (专用公共数据块) 至多 1 个 IDAT 之前
IDAT 图像数据块 至少 1 个 和其它 IDAT 连续
tIME 图像最后修改时间数据块 至多 1 个 任意
tEXt 文本信息数据块 任意个 任意
zTXt 压缩文本数据块 任意个 任意
fRAc (专用公共数据块) 任意个 任意
glFg (专用公共数据块) 任意个 任意
glFt (专用公共数据块) 任意个 任意
glFx (专用公共数据块) 任意个 任意
IEND 文件尾数据块 1 个 最后一块

LSD 定义的数据块类型

下列的数据块类型,是真正组成 LSD 的部分

类型 说明 数目 位置
.LSD LSD 元数据块 至多 1 个 任意
.LDT LSD 普通数据块 任意个 .LSD 之后
.LRF LSD 运行时文件数据块 任意个 .LSD 之后
.LOM LSD ROM 数据块 任意个 .LSD 之后

特殊数据块结构

.LSD 元数据块

只有此数据块存在时,此 PNG 文件才被视为 LSD

元数据块应有如下的标准结构:

顺位 名称 设计尺寸 说明
1 产品标识码 8 字节 8 字节长的 ASCII 字符组,标识该文件存储的是源于哪个系列产品的数据
2 版本信息 8 字节 8 字节长的 ASCII 字符组,标识该文件存储的数据版本,可用于兼容性判断等
3 端序标记 1 字节 表示最后保存数据时使用的字节序 0x0A 为大端序;0x0C 为小端序
4 保留(填充)字段 0 3 字节 暂无使用场景
5 保留(填充)字段 1 4 字节 暂无使用场景
6 保留(填充)字段 2 8 字节 暂无使用场景

.LDT 普通数据块(LSD Data)

一般来说,此数据块都是自定义的数据,可以根据元数据块的信息决定解析的方式;这也应该是最通用的数据部分

.LRF 运行时文件数据块(LSD Runtime File)

此数据块存储在运行时进行释放的文件数据;即:读档时,此数据块的全部内容会被释放到 目标目录 下,存档时,这些内容也应以此数据块的形式存入存档中;游戏结束时,这些文件需被清理

典型的应用场景为数据库

本数据块应有如下的标准结构:

顺位 名称 设计尺寸 说明
1 目标目录类型 1 字节 0x3A 为用户目录;0x5A 为临时文件目录
2 压缩类型 1 字节 0x1A 为不压缩;0x1Fdeflate0x22LZ4
3 保留(填充)字段 2 字节 暂无使用场景
4 相对路径 不定长 说明此运行时文件的释放路径
5 文件数据 不定长 此文件的存储数据,其长度就是此数据块的剩余长度

.LOM ROM 数据块(LSD Rom)

在特殊的系列作品中,此数据块会被映射为某种内存区域,通过寻址方式来访问;然而,真正访问文件的效率必然不高,所以通常此数据块的内容会被读入另准备的 ROM 缓冲区,再做处理