При отправке данных из JavaScript в C ++ значения байтов свыше 127 заменяются на «символ замены» - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь отправить буферы данных из приложения JavaScript в приложение C ++ через ZeroMQ (C ++ и npm zeromq). Если буфер содержит байт> 127, то байт данных заменяется на 3 байта:

\xEF\xBF\xBD

Исследования показывают, что это значение UTF-8 для символа замены Unicode (U+FFFD).

Похоже, что такого не происходит в JavaScript до вызова функции ZeroMQ send, и данные уже повреждены, когда я могу получить их на стороне C ++ через вызов ZeroMQ 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);

1 Ответ

1 голос
/ 27 мая 2019

Я думаю, что вы прибили диагноз.Это похоже на открытый выпуск с zeromq.js, и это правильно - библиотека сообщений, которая не работает в двоичном формате!?!

Автор проблемы предлагает вместо этого zeromq-ng.

Другой альтернативой является использование Base64.

...