拆一个二进制格式:从 pxls.bytes 还原可编辑工程文件
一次小型的逆向记录:不重写整个格式,只找最小差异。
背景
一款同人游戏的像素资产有两种形态:游戏导出的 pxls.bytes(图集 + UV),和 PixelLiner 的工程文件 .pxl。想改里面的像素小人,但常见工具只能拆出图集和 PNG,还原不回可编辑工程。
观察
- 两种文件都以
%PACK_SECTION%为核心,差别在于:导出格式的图集记录带一个「贴图外置」标志位 - 把标志位清掉、PNG 内嵌回去,文件就变成 PixelLiner 能直接打开的形态
- 打开后它会自动把 PXLS 转成可编辑角色,另存就得到标准工程文件
结论:不需要重新实现整个工程格式,只需要处理这一个差异点。
实现
- 纯标准库解析,不依赖 Pillow
- 从 PACK 段读每个图块的 UV,从纹理图集裁出单张 PNG
- 重建 pxl:改标志位、内嵌 PNG、补齐段表
--verify做结构自校验,避免「看起来能打开」但结构损坏
只做容器级改写:解析 section 表,只替换 %PACK_SECTION% 的内容,其余段(%POSE_SECTION%、%PTCL_SECTION%、%IMGV_SECTION% 等)原样复制。这样风险最小,也不会因为猜错段结构把文件写坏。
为什么不直接重写格式
因为成本不在写代码,在于确认自己没理解错。二进制格式里最贵的错误是「读出来像对、写回去全歪」。只改一个标志位,可验证面积小,出错也能定位。
教训
- 先找最小差异,别一上来重写整个格式
- 用真实样本 + 失败样本对照,比读文档快
- 自校验很便宜,能省掉大量「看起来成功」的返工
工具在 github.com/Dax233/AICPxlsUnpacker。
NEED A HAND
有打不开的工程文件、或者想把某个数据转成可编辑格式?发一个样本过来,我先看看可行性。
独立开发者 · 远程接单github.com/Dax233