直至正文
豫言包府
← 众包

豫言操作系统压缩 0.1.0

豫言 · 库

以宿主原生流解压 raw deflate 数据,并核对 ZIP 条目的 CRC-32 与大小。

压缩公约 0.1.0

此包依宿主原生解压之流,立二术:其一,限出量而解 raw deflate;其二,解 ZIP 之一条目而核其 CRC-32 与实数。此乃云工专用之能,不用绑定,亦无须资源之许。入者字节串,出者 (整数 合 字节串):整数为状,字节串为所解之物,状不为零则空。数据之可复者,以状返之;参数违规、入过大、出限越界,则抛豫言之异,客可以「尝试运行」取之。

状

| 状 | 义 | 所适 | | --- | --- | --- | | 零 | 成;所返即全部所解 | 二术皆有 | | 一 | 出逾限;读时累计逾限,即止其流,不复解 | 二术皆有 | | 二 | 数据坏或缺(含末有余字节) | 二术皆有 | | 三 | 数据可解,然 CRC-32 或实数与所期不合 | 惟解压归档条目 |

判状一,不问所期:解出累计之字节数大于出限,即止流而返一;恰等于出限者成。

解压原始压缩

解压原始压缩 受 raw deflate 字节串(无 zlib、无 gzip 首,即 ZIP 内之法八)与出限,返 (状 合 果)。

  • 入不得逾一千六百七十七万七千二百一十六字节(宿主值桥之限),出限当在一至一亿三千四百二十一万七千七百二十八之间;越界则抛豫言之异。一亿三千余万乃接口所许之上,非所荐:果存于 Wasm 内存,客当依己之内存预算择出限(Cloudflare Workers 内存约百二十八兆)。
  • 合法之入,其果与 Node 之 zlib.inflateRawSync 逐字节相同,含出为空之合法流(如 03 00,得状零与空串)、存储块、静动哈夫曼块及跨多出块之大果。
  • 入空、流截、流坏,皆状二。流终而末有余字节(含二流首尾相接)亦状二:此与浏览器、workerd 及 Node 之 DecompressionStream 同,不同于 zlib.inflateRawSync(其略末余)。
  • 压缩之炸(入甚小而出极巨)不整解:每读一出块,先核累计之长,逾则止。
  • 既坏且逾者,宿主流之缓冲深浅不同,或先出块(状一),或先报错(状二);客当以非零之状一律为败。

解压归档条目

解压归档条目 参数依次为:条目数据、法、所期 CRC-32、所期解压实数、出限。此为 ZIP 归档析库而设:库循中央目录得法、CRC-32 与实数,以本地文件首之后、长恰为压缩实数之条目数据授此术。

  • 法:零 为存(数据即原文),八 为 raw deflate;余法抛豫言之异。
  • 所期 CRC-32 当在零至四十二亿九千四百九十六万七千二百九十五之间;所期实数当在零至出限之间(所期大于出限乃客之参数误,抛异);出限当在一至一亿三千四百二十一万七千七百二十八之间;数据不逾十六兆。违者皆抛豫言之异。
  • 状零:数据全、CRC-32 与实数俱合所期,果乃已验之所解。验由宿主原生为之,不在豫言逐字节算。
  • 状一:出逾出限。所期实数出于不可信之归档目录,或小于实出:“诳”之条目亦受出限所制。
  • 状二:deflate 流自身坏、截,或末有余字节。存之法,数据为任意字节,永不为状二。
  • 状三:数据可解(流自身合法)而 CRC-32 或实数与所期不合;存之法,数据之长不等于所期实数,亦为三。
  • 先后:存之法先较其长——数据之长大于出限则一,否则不等所期实数则三,否则入验;deflate 之法由宿主解压流验之,败则复以 raw deflate 解一过以别之:复解逾限则一,复解败则二,复解成则为 CRC-32 或实数不合而三。如此,宿主流无论先出块或先报错,其状皆同(既坏且逾者除外,如上)。

限

| 项 | 上限 | 违者 | | --- | --- | --- | | 入字节数 | 十六兆 | 豫言之异 | | 出限 | 一至一亿三千四百二十一万七千七百二十八 | 豫言之异 | | 所期实数 | 零至出限 | 豫言之异 | | 所期 CRC-32 | 零至四十二亿九千四百九十六万七千二百九十五 | 豫言之异 |

诸宿主同一

任一宿主之实现,须使:状之义如上;合法入之果字节与 zlib 之 raw inflate 同;累计逾限即止解;末有余字节为状二;CRC-32 与实数之验由原生解压库为之。云工之适配以 DecompressionStream('deflate-raw') 解之,以 DecompressionStream('gzip') 借 gzip 尾之 CRC-32 与 ISIZE 验条目(包条目为 gzip 容器,存之法之数据先包为 deflate 存储块);他宿主可用原生 zlib 得同一可观之果。

同一之例

  • 解压原始压缩 于 zlib.deflateRawSync("abc"),出限十:(零 合 "abc");出限二:(一 合 空);出限三:(零 合 "abc")。
  • 解压原始压缩 于空入:(二 合 空);于 03 00:(零 合 空);于合法流后随一字节:(二 合 空)。
  • 解压归档条目 于 "123456789":法零,CRC-32 0xCBF43926,实数九:(零 合 "123456789");CRC-32 改为零:(三 合 空);实数改为八或十:(三 合 空);出限八(所期实数仍九):抛异。
  • 存之条目长零、一、六万五千五百三十四、六万五千五百三十五、六万五千五百三十六、六万五千五百三十七、十三万零七十、十三万零七十一字节,验皆为零(覆存储块之边);deflate 条目改一字节:可解则三,不可解则二。

界

此包但解单条目之数据,不析 ZIP 目录、本地文件首、加密、Zip64 与数据描述符,亦不供压缩。CRC-32 不别立为术:纯豫言逐字节算之则太慢,而平台之 Web Crypto 无 CRC-32,故惟由解压而验。果字节串存于 Wasm 内存,出逾宿主内存预算者,乃客择出限时之责。

所赖

观包之制

上传之记

今修订:1 ·

  1. 修订 1
    取 ZIP

包之层级

父:豫言操作系统接口

无子包。