Байт 128 или выше в JavaScript манипулируется при отправке в приложение C ++. Как это остановить? - PullRequest
1 голос
/ 24 мая 2019

Я создаю тестовую сеть, в которой приложение node.js связывается с приложением C ++ через ZeroMQ с использованием буферов протокола Google для структуры сообщения.

Данные из C ++ в JavaScript можно сериализовать, отправлять, получатьи десериализован без проблем.Тем не менее, у меня проблема с движением в противоположном направлении.

Если сообщение Protobuf, идущее из JavaScript в C ++, содержит целое число с заданным значением, превышающим 127, данные обрабатываются в некотором месте по проводам, где изменяется множество байтов полезной нагрузки.

Обратите внимание, что каждое сообщение, отправленное в обоих направлениях, имеет 4-байтовый заголовок, который работает (сшито) правильно, поэтому я пока не буду включать это в разговор.

Я заметил это на стороне JS перед отправкой,байты для сериализованных данных protobuf будут выглядеть примерно так:

26,4,129,192,136,24,64,40 хранится в типе Buffer (npm).

Однако на стороне C ++ после получения я получаю:

26,4,239,191,189,239,191,189 хранится в контейнере std :: string.

Я проверил, что байты в буфере JS не меняются до того момента, когда вызывается sub ZeroMQ.Однако после этого я не могу сказать, что происходит или когда значения меняются.

Я безуспешно пытался принудительно использовать любые типы буферов для Uint8Arrays.Больше я ничего не пробовал, потому что не уверен, в чем суть проблемы.

Это основной процесс создания сообщений на стороне JavaScript.

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);

При получении этого на стороне C ++ будет получено совершенно другое сообщение.Имейте в виду, что если data.setTemp() имеет значение <127, то это сообщение будет получено на стороне C ++ без проблем. </p>

...