vCard 解剖:一行一属性、75 字符折行与 iPhone item1. 分组的私有方言

手机通讯录导出的 .vcf 是纯文本:BEGIN:VCARD 开场、一行一个属性、分号分隔结构化字段。这篇拆解 vCard 的转义次序为什么不能乱、规范折行如何用「换行加空格」回接长行、N 与 FN 谁说了算、中文名该怎么拆,以及 iPhone 导出文件里 item1.TEL 这类私有分组写法的兼容处理。

EPUB 解剖:一个 ZIP 如何装下一本书,mimetype 为何必须第一个且不压缩

EPUB 3 的本质是一个改了打包规矩的 ZIP:mimetype 条目必须排第一、必须 STORE 不压缩,META-INF/container.xml 指路,OPF 清单串起章节与双目录(EPUB 3 的 nav 加兼容旧阅读器的 toc.ncx)。这篇按规范逐层拆开 .epub,并讲 TXT/Markdown 按章节切分的正则细节与为什么全程可以在浏览器里完成。

ID3 标签解剖:synchsafe 整数、反同步与 MP3 乱码歌名的字节级真相

MP3 里显示的歌名、歌手、封面不是音频数据,是嵌在文件头部的 ID3 标签。这篇逐字节拆解 ID3v2 的帧结构:synchsafe 整数为什么要砍掉每个字节的最高位、unsynchronisation 防的是什么假警报、四种文本编码如何决定中文是正常显示还是乱码,以及文件末尾那 128 字节的 ID3v1 遗产。

DEFLATE 解剖:LZ77 与霍夫曼如何压掉七成体积,gzip 头尾字段逐个讲

gzip 文件 = 10 字节头 + DEFLATE 流 + 8 字节尾。这篇拆开三层:RFC 1952 的容器字段、RFC 1951 里 LZ77 滑窗与霍夫曼编码的接力、以及浏览器 CompressionStream 一行流式 API 的能力边界——为什么没有压缩级别参数、为什么多成员 gzip 只解出第一个。

MP4 文件结构:ISO-BMFF 的 box 逐层拆解

播放器能在两 GB 的文件里秒级定位画面,靠的是 MP4 的 box 索引树。从 size 与 type 两个通用字段讲起,逐层拆开 moov 里的 mvhd、tkhd、stsd、stts、stsz,解释手机竖拍的旋转藏在哪个字段、分片 fMP4 长什么样,以及为什么 MP4 压不小必须重编码。

文件取证入门:EXIF、魔数与改后缀的把戏

把 .exe 改名成 .jpg 骗得过文件管理器,骗不过文件开头的魔数。本文拆解 PNG、PDF、ZIP 的签名字节、ZIP 家族的内部伪装、JPEG 里挂载的 EXIF/TIFF 结构,以及位置隐私是怎么随一张原图泄露出去的。

GIF 格式解剖:LZW、交织与帧合成的每一字节

一个 1987 年的格式至今撑着表情包与客服动图,靠的是 LZW 变长码、帧增量合成与交织扫描这三板斧。逐字节拆解 GIF 的文件结构、LZW 解码的 KwKwK 特例、disposal 语义与 NETSCAPE 循环扩展,并说明为什么抽帧工具要用零依赖纯 JS 从头实现。