Page 265 - Web性能权威指南
P. 265
var ws = new WebSocket('wss://example.com/socket');
ws.binaryType = "arraybuffer"; ➊
ws.onmessage = function(msg) {
if(msg.data instanceof ArrayBuffer) {
processArrayBuffer(msg.data);
} else {
processText(msg.data);
}
}
➊ 如果接收到二进制数据,将其强制转换成 ArrayBuffer
用户代理可以将这个选项看作一个暗示,以决定如何处理接收到的二进制数
据:如果这里设置为“blob”,那就可以放心地将其转存到磁盘上;而如果
设置为“arraybuffer”,那很可能在内存里处理它更有效。自然地,我们鼓励
用户代理使用更细微的线索,以决定是否将到来的数据放到内存里……
——The WebSocket API
W3C Candidate Recommendation
Blob 对象一般代表一个不可变的文件对象或原始数据。如果你不需要修改它或者不
需要把它切分成更小的块,那这种格式是理想的(比如,可以把一个完整的 Blob 对
象传给 img 标签,参见 15.3 节“通过 XHR 下载数据”)。而如果你还需要再处理接
收到的二进制数据,那么选择 ArrayBuffer 应该更合适。
使用 JavaScript 解码二进制数据
ArrayBuffer 表示一个普通的、固定长度的二进制数据缓冲。不过,可以用
ArrayBuffer 创建一或多个 ArrayBufferView 对象,每一个都可以通过特定的格式
来展示缓冲中的内容。比如,假设我们需要处理下面类似 C 的二进制数据结构:
struct someStruct {
char username[16];
unsigned short id;
float scores[32];
};
在取得这个类型的 ArrayBuffer 对象后,可以对同一个缓冲创建多个不同的视图,
每个视图的偏移量和数据类型都可以不一样:
var buffer = msg.data;
var usernameView = new Uint8Array(buffer, 0, 16);
var idView = new Uint16Array(buffer, 16, 1);
var scoresView = new Float32Array(buffer, 18, 32);
console.log("ID: " + idView[0] + " username: " + usernameView[0]);
for (var j = 0; j < 32;j++) { console.log(scoresView[j]) }
254 | 第 17 章