Javascript:通过node.js二进制websockets发送int数组

时间:2013-09-13 13:35:15

标签: javascript node.js binary websocket

我有以下情况。我通过带有context.getImageData().data的画布捕获网络摄像头帧。当我[r, g, b, a, r, g, b, a, r, g, b, a, etc.]时,这给了我一个很好的数组(或UInt8ClampedArray说Bidelman)像console.log()这样的整数。现在我想通过binaryjs将它发送到node.js服务器,当然数据得到了像地狱一样的混乱:https://gist.github.com/thgie/6550638

如何首先将数组转换为二进制文件,或者如何将二进制文件转换回可读数组?

代码示例

客户端:

client.send(ctx.getImageData(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT).data, {'id': 'bin', 'frame': frame});

服务器:

client.on('stream', function(stream, meta){

  var bufs = [];

  stream.on('data', function(data){
    bufs.push(data);
  });

  stream.on('end', function(){

    var buf = Buffer.concat(bufs);

    fs.writeFile(__dirname + "/tmp/"+meta.frame+".dat", buf, "binary", function(err) {
      if(err) {
        console.log(err);
      } else {
        console.log("The file was saved!");
      }
    });
  });
}

看起来像这样:

H>DÿNDJÿL@FÿPCJÿR@KÿQ?IÿLDPÿKCOÿMCKÿLAIÿL@DÿL@DÿLBGÿKAFÿIAHÿLDLÿLAIÿLAIÿO@IÿO@IÿIAJÿJBKÿMCIÿNDJÿQEIÿQEIÿPGHÿOFGÿMIHÿMIHÿPDFÿNCEÿIBDÿLEHÿPDFÿPDFÿMHLÿLGKÿMHLÿNIMÿOGLÿNFKÿOEMÿPFNÿRFSÿPERÿPERÿPERÿRGOÿSHPÿSGMÿSGMÿRJRÿQIPÿQJNÿRKPÿRKPÿQJNÿSGMÿSGMÿOHJÿSLOÿQJLÿRKMÿSIJÿTKKÿQLPÿPJNÿSLQÿRKPÿSLQÿUMRÿSKSÿUMTÿVMWÿSKUÿUJUÿRGQÿUMTÿUMTÿSKUÿVMWÿSMTÿSMTÿQNVÿQNVÿSMVÿTNWÿZMVÿXKTÿUJUÿVKVÿTOSÿTOSÿWQUÿWQUÿYTVÿYTVÿXRVÿUPTÿYSZÿYSZÿXRVÿZUYÿWPRÿYRTÿWRQÿXSRÿVOOÿWPPÿXRVÿXRVÿZOYÿ[P[ÿZO[ÿ\Q^ÿZT_ÿZT_ÿZV`ÿZV`ÿ]T^ÿ]T^ÿ^TZÿ`V[ÿ[VXÿ[VXÿ]UZÿ^V[ÿZV`ÿ[Waÿ_Xdÿ_Xdÿ]X`ÿ]X`ÿaZ_ÿaZ_ÿ_Y]ÿ`[_ÿ`Y]

1 个答案:

答案 0 :(得分:1)

就浏览器方面而言,您可以使用chrome的开发工具轻松验证。查看二进制流量,它会告诉您是否发送文本帧的二进制文件。它们是websocket规范中不同类型的帧。

在节点端,您可以使用Buffer.isBuffer()验证缓冲区值是否为真正的节点缓冲区。我看到你正在使用“二进制”字符串编码编写缓冲区。这可能不是你想要的。在节点中,本机Buffer实例的编码为null"binary""ascii""utf8""hex""base64"编码都是字符串编码/解码。二进制编码的含义是每个字节都作为8位unicode代码点存储在字符串中。

// Convert a binary buffer into a "binary" encoded string.
function binaryEncode(buffer) {
  var string = "";
  for (var i = 0, l = buffer.length; i < l; i++) {
    string += String.fromCharCode(buffer[i]);
  }
  return string
}

// Convert a "binary" encoded string into a binary buffer.
function binaryDecode(string) {
  var length = string.length;
  var buffer = new Buffer(length);
  for (var i = 0; i < length; i++) {
    buffer[i] = string.charCodeAt(i);
  }
} 

因此,可以在JavaScript字符串(其定义为每个字符具有16位unicode代码点)中非常安全地存储二进制数据。这不是最有效的事情,因为你浪费了每个字符的高8位,这就是为什么node.js更喜欢原生的Buffers。但是在浏览器加密库之类的东西中,这种“二进制”字符串编码很常见,因为它在所有JS平台上都受支持。