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 章
   260   261   262   263   264   265   266   267   268   269   270