# 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 个 | 在 ```PLTE``` 和 ```IDAT``` 之前 | | ```gAMA``` | 图像 γ 数据块 | 至多 1 个 | 在 ```PLTE``` 和 ```IDAT``` 之前 | | ```sBIT``` | 样本有效位数据块 | 至多 1 个 | 在 ```PLTE``` 和 ```IDAT``` 之前 | | ```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``` 为不压缩;```0x1F``` 为 ```deflate```;```0x22``` 为 ```LZ4``` | | 3 | 保留(填充)字段 | 2 字节 | 暂无使用场景 | | 4 | 相对路径 | 不定长 | 说明此运行时文件的释放路径 | | 5 | 文件数据 | 不定长 | 此文件的存储数据,其长度就是此数据块的剩余长度 | ### ```.LOM``` ROM 数据块(```LSD``` Rom) 在特殊的系列作品中,此数据块会被映射为某种内存区域,通过寻址方式来访问;然而,真正访问文件的效率必然不高,所以通常此数据块的内容会被读入另准备的 ROM 缓冲区,再做处理