本文介绍在 Odin 中解码 REXPaint (.xp) 文件。REXPaint ASCII 艺术文件采用 gzip 压缩;解压后得到小端二进制数据:版本、图层数,然后是每个图层的宽高和单元格。每个 10 字节的单元格存储一个 CP437 字符索引以及前景/背景 RGB 颜色。空白或透明单元格使用品红色 (255, 0, 255)。单元格按列主序存储,因此 (x, y) 处的单元格索引为 x*height+y。
解析器定义了 Color、Cell、Layer 和 File 结构体,以及自定义的 Read_Error 和 Decode_Error 类型。它使用 core:compress/gzip 解压,通过一个小的 Reader 游标读取值,在分配前验证尺寸和大小,并使用 defer 在出错时清理内存。它提供 decode_from_file 和 decode_from_bytes,并包含 file_destroy 用于释放嵌套分配。cell_at 辅助函数隐藏了列主序索引。最后,一个示例解码 test.xp 并打印可打印的 ASCII 字形。总体而言,它展示了安全的二进制解析:验证不受信任的数据、传播错误、管理内存,并将原始字节映射为可用结构。