3

我有以下情况。我通过带有context.getImageData().data. 这给了我一个很好的整数数组(或 UInt8ClampedArray 说 Bidelman),就像[r, g, b, a, r, g, b, a, r, g, b, a, etc.]我在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]
4

1 回答 1

1

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

在节点方面,您可以通过使用来验证您的缓冲区值是真正的节点缓冲区Buffer.isBuffer()。我看到您正在使用“二进制”字符串编码编写缓冲区。这可能不是你想要的。Buffer在 node 中,本机实例的编码是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 更喜欢本机缓冲区的原因。但是在浏览器加密库之类的东西中,这种“二进制”字符串编码很常见,因为它在所有 JS 平台上都受支持。

于 2013-10-24T20:21:22.630 回答