JavaScript语言本身并不直接支持以字节数组的形式操作二进制数据。这使得在JavaScript中使用社区开发的算法和编码变得困难。例如,DEFLATE压缩格式就是一个典型的例子。如果JavaScript代码需要在Web浏览器中运行,那么数据必须通过HTTP传输,这进一步增加了处理二进制数据的复杂性。
为了解决这个问题,提出了一种实现方案,即通过JavaScript对象数组来模拟字节数组。此外,该实现还试图解决将二进制数据传输到客户端脚本的问题。假设有DEFLATE压缩数据(例如.NET的System.IO.Compression命名空间、Java的java.util.zip.*、PHP的http_deflate),并且有办法将其以BASE64格式传输到客户端。
deflate.js包含了实现DEFLATE算法(RFC 1951)解压缩部分的函数和类。要使用这个算法,其输入必须以字节流的形式呈现。
// 创建BASE64字节流读取器
var reader = new Base64Reader(base64string);
该类提供了readByte()方法,返回下一个字节,如果到达流的末尾则返回-1。
// 创建解压缩器
var inflator = new Inflator(reader);
Inflator类与之前的类一样,提供了readByte()方法,返回解压缩字节流中的下一个字节。此时可以消费二进制流。
如果常规文本被压缩,并且需要从UTF-8字节重新编码为字符,使用Utf8Translator类来检索字符而不是字节。
// 创建翻译器
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%的文本数据压缩,仍然可以减少存储/传输的数据量。