【问题标题】:How do i send binary data from C++ to Javascript如何将二进制数据从 C++ 发送到 Javascript
【发布时间】:2015-10-24 04:36:19
【问题描述】:

我正在尝试将二进制数据从 C++ 发送到 Javascript,并逐字节解释它。为此,我使用了一个简单的 TCP 服务器和来自 node.jsnet 模块。 这是 C++ 代码:

    char a[4]={128,0,0,1};
    std::stringstream stream;
    stream.write(a,sizeof(a));
    server.send(stream);

对于 Javascript 方面:

var client = new net.Socket();
client.setEncoding('utf8');
client.setNoDelay(true);

client.connect({port:25003},handler);

client.on('data', function(data) {
    var thedata=data;
    console.log('Received from C++: ' + thedata.length+"bytes");
        console.log('DATA: '+thedata);
      for(var i=0;i<thedata.length;i++)
      {
          buffer1[i]=thedata.charCodeAt(i);
      }
      console.log(buffer1[0]);
});

代码简要说明:

C++ 通过 TCP 发送 4 个字节:128 0 0 1

Javascript 使用charCodeAt 函数将接收到的数据保存在Uint8Array 中。

所以基本上我的问题是我只能发送 0-127 之间的“数字”,因为在 javascript 中我似乎需要使用 charCodeAt 函数,这对于超过 127 的值来说很疯狂。更糟糕的是,当我尝试通过 socket.io 连接发送它,它会创建一个 16 位字符串。

如何在 Javascript 端处理字节?我的意思是,简单地将其解释为 128 0 0 1?

【问题讨论】:

  • @max 我认为 JavaScript 代码是在 Node 中运行的
  • 是的,它正在 Node 中运行
  • 认为您希望完全避免调用.setEncoding() - 您不希望Node 将字节流解释为具有任何特定编码的字符。如果你不调用它,那么你的“数据”事件将被传递给 Buffer 实例而不是字符串。

标签: javascript c++ sockets tcp


【解决方案1】:

因为您使用了这一行: client.setEncoding('utf8');

超过 127,最高位将设置为 1,这意味着当前字符被编码为多个字节(这似乎不是你的情况,因为它是二进制的)。 你混淆了字节和字符。

尝试其他编码,如 ASCII 但 utf8。

【讨论】:

  • 这是在正确的轨道上——我认为正确的做法是避免设置任何编码。
猜你喜欢
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 2019-07-18
  • 2019-09-23
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多