【问题标题】:Sending data from JavaScript to C++, byte values over 127 are replaced with "replacement character"将数据从 JavaScript 发送到 C++,超过 127 的字节值被替换为“替换字符”
【发布时间】:2019-05-25 13:07:14
【问题描述】:

我正在尝试通过 ZeroMQ(C++ 和 npm zeromq)将数据缓冲区从 JavaScript 应用程序发送到 C++ 应用程序。如果缓冲区包含大于 127 的字节,则数据字节被替换为 3 个字节:

\xEF\xBF\xBD

研究表明,这是 Unicode 替换字符 (U+FFFD) 的 UTF-8 值。

在调用 ZeroMQ send 函数之前,这似乎不会在 JavaScript 中的任何地方发生,并且当我可以通过 ZeroMQ recv 调用在 C++ 端接收数据时,数据已经损坏。

我尝试将 JavaScript 端的缓冲区类型更改为 UintArray 类型,看看是否有任何改变,但没有成功。我不确定还能尝试什么。

有没有办法在不使用npm zeromq 源文件的情况下解决这个问题(我不知道该怎么做,或者我是否愿意)。

更新*消息构建代码示例*

var data = new ProtoData.Data1();
data.setTemp(128); // type is int32
var payload = data.serializeBinary();
var size = payload.length + 4; // 16 bits
var head1 = 4; // 8 bits
var head2 = 4; // 8 bits
var payload_buf = Buffer.from(payload);
// create the header
var header = Buffer.allocUnsafe(4);
header.writeUInt16LE(size, 0);
header.writeUInt8(head1, 2);
header.writeUInt8(head2, 3);
var msg = Buffer.concat([header, payload_buf]);
zmqPubSock.sock.send(msg);

【问题讨论】:

  • 您似乎正在使用 JavaScript 文本函数和数据类型处理二进制数据。请出示您的代码。
  • @Tom Blodgey 完成!谢谢

标签: javascript c++ node.js utf-8 zeromq


【解决方案1】:

我认为你已经完成了诊断。它看起来像一个带有 zeromq.js 的open issue,而且是正确的——一个不做二进制的消息传递库!?!

问题报告者建议使用 zeromq-ng。

另一种选择是使用 Base64。

【讨论】:

  • 谢谢,汤姆!我会研究替代方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多