JavaScript 中的二进制格式:Base64、Deflate 和 UTF8





5.00/5 (10投票s)
本文演示了在 JavaScript 中使用二进制格式。
引言
本文演示了在 JavaScript 代码中使用二进制格式。JavaScript 本质上无法操作表示为内存片段的二进制数据,即字节数组。这使得使用社区开发的算法和编码变得困难。一个很好的例子是 DEFLATE 压缩格式。如果 JavaScript 代码必须在 Web 浏览器上运行,这会带来更多问题:数据必须通过 HTTP 传递。
在所提出的实现中,字节数组由常规的 JavaScript 对象数组模拟。此外,给定的实现尝试解决将二进制数据传输到客户端脚本的问题。假设我们有 DEFLATE 压缩数据(.NET 的 System.IO.Compression
命名空间,Java 的 java.util.zip.*
,PHP 的 http_deflate
),并且有一种以 BASE64 格式将其传输到客户端的方法。
Using the Code
deflate.js 包含实现 DEFLATE 算法(RFC 1951)的解压缩部分的函数和类。要使用此算法,其输入必须表示为字节流。
// create BASE64 byte stream reader
var reader = new Base64Reader(base64string);
该类公开了 readByte()
方法,该方法返回下一个字节,如果到达流的末尾则返回 -1。
// create inflator
var inflator = new Inflator(reader);
与前面的类一样,Inflator
类公开了 readByte()
方法,该方法从解压缩的字节流中返回下一个字节。二进制流可以在此时被消耗。
如果压缩的是常规文本,并且需要从 UTF-8 字节重新编码为字符,我们使用 Utf8Translator
类来检索字符而不是字节。
// create translator
var translator = new Utf8Translator(inflator);
该类公开了 readChar()
方法,该方法返回一个单字符字符串,其中包含下一个可用字符,如果指示流的末尾则返回 null。deflate.js 文件还包含 UnicodeTranslator
和 DefaultTranslator
。
为了方便起见,存在 TextReader
类,它不仅公开了 readChar()
方法,还公开了 readToEnd()
和 readLine()
方法。
这些函数/类不仅可以在 Web 浏览器的上下文中使用,还可以在 OS 脚本或旧版 ASP 编程中使用。
包中包含的 SamplePage.htm 显示了 RFC 1951 备忘录内容。
关注点
deflate.js 函数将有助于对 AJAX 请求的数据执行选择性压缩。在 AJAX 操作中传输的大多数数据是文本或二进制数据的文本表示。
由于并非所有 Web 浏览器都可以将远程数据作为字节数组检索(如 IE 的 XmlHTTPRequest
中的 responseBody
),因此必须将 BASE64 编码的数据从服务器传输到客户端。即使 BASE64 数据在其原始大小上增长 133%,文本数据压缩 75% 仍然会减少要存储/传输的数据量。
在 JavaScript 中模拟字节数组作为对象数组会降低解决方案的性能,例如,在 Web 浏览器上下文中提取 50K 需要 1-2 秒。
RFC 1951、2779、2781 和 4648 用于实现底层算法。有写得很好的备忘录。有许多基于开放 DEFLATE 压缩格式的格式(例如,GZIP、PNG、SVGZ、SWF);在 JavaScript 中实现它提供了另一种访问/重用数据的方式。