将数据从 JavaScript 发送到 C++,超过 127 的字节值将替换为 "replacement character"

Sending data from JavaScript to C++, byte values over 127 are replaced with "replacement character"

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

\xEF\xBF\xBD

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

在调用 ZeroMQ send 函数之前,JavaScript 中的任何地方似乎都没有发生这种情况,并且当我可以通过 ZeroMQ 在 C++ 端接收数据时,数据已经损坏 recv打电话。

我已经尝试将 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);

我认为您做出了诊断。它看起来像 open issue 和 zeromq.js,确实如此——一个不执行二进制的消息传递库!?!

问题记者建议改为zeromq-ng。

另一种选择是使用 Base64。