I found the solution.
This stackoverflow post described a really similar issue, and it helped me
to fix my parsing as well :
https://stackoverflow.com/questions/68750875/protobuf-serialize-deserialize-c-to-js
Here is my updated code, which works well :
I had to update the Javascript side :
```javascript
function sendMessage() {
Module.self().setMyMessage(module$contents$protobufMessageGenerator_generateMyMessage().serializeBinary().toString())
}
sendMessage()
```
and the C++ side :
```cpp
namespace
{
QByteArray decryptProtobufMessage(const std::string &str)
{
QStringList strList = QString::fromStdString(str).split(',');
QByteArray bytedata;
foreach (const QString &str, strList)
{
bytedata += (str.toUInt());
}
return bytedata;
}
} // namespace
void JavascriptPublicInterface::setMyMessage(const QByteArray &myMessage)
{
if (_myMessage != myMessage)
{
_myMessage = myMessage;
emit myMessageChanged();
}
}
void JavascriptPublicInterface::setMyMessageEMS(const std::string
&myMessage)
{
setMyMessage(decryptProtobufMessage(myMessage));
}
//...
void startListeningToMyMessage(std::function<void(euf_proto::MyMessage
myMessage)> listener)
{
const auto changedListener = [listener]() {
const auto newMyMessageByteArray =
JavascriptPublicInterface::self()->myMessage();
my_proto::MyMessage myMessagePb;
if (myMessagePb.ParseFromArray(newMyMessageByteArray.data(),
newMyMessageByteArray.size()))
{
qDebug() << "C++ : Successfully parsed new MyMessage: " <<
newMyMessageByteArray;
}
else
{
qDebug() << "C++ : Failed to parse new MyMessage: " <<
newMyMessageByteArray;
}
qDebug() << "MyMessage received: " <<
QString::fromStdString(myMessagePb.DebugString());
listener(myMessagePb);
};
if (!QObject::connect(JavascriptPublicInterface::self(),
&JavascriptPublicInterface::myMessageChanged, changedListener))
{
throw std::runtime_error("Failed to connect to
JavascriptPublicInterface myMessageChanged");
}
}
```
On Friday, February 18, 2022 at 6:36:19 PM UTC+1 Csaba Szigeti wrote:
> The issue is not fixed yet, but I got much-much closer to fixing it.
>
> Using this code, from the Javascript console, I printed my protobuf
> message as hex :
> ```javascript
> function buf2hex(buffer) { // buffer is an ArrayBuffer
> return [...new Uint8Array(buffer)]
> .map(x => x.toString(16).padStart(2, '0'))
> .join('');
> }
>
>
> buf2hex(module$contents$protobufMessageGenerator_generatePubDetailsMessage().serializeBinary())
> ```
>
> I copy pasted it into a.txt, and converted it :
> ```bash
> cat a.txt | tr ',' '\n' | xargs printf '\\\\x%02x'
>
> ```
>
> and I copy pasted this output as well, and generated a.bin like this :
> ```bash
> echo -n -e
> \\x2a\\xd2\\x02\\x1a\\x93\\x01\\x0a\\x0c\\x45\\x6d\\x69\\x74\\x74\\x65\\x72\\x20\\x4e\\x61\\x6d\\x65\\x12\\x0d\\x45\\x6d\\x69\\x74\\x74\\x65\\x72\\x20\\x54\\x69\\x74\\x6c\\x65\\x1a\\x74\\x69\\x56\\x42\\x4f\\x52\\x77\\x30\\x4b\\x47\\x67\\x6f\\x41\\x41\\x41\\x41\\x4e\\x53\\x55\\x68\\x45\\x55\\x67\\x41\\x41\\x41\\x41\\x55\\x41\\x41\\x41\\x41\\x46\\x43\\x41\\x59\\x41\\x41\\x41\\x43\\x4e\\x62\\x79\\x62\\x6c\\x41\\x41\\x41\\x41\\x48\\x45\\x6c\\x45\\x51\\x56\\x51\\x49\\x31\\x32\\x50\\x34\\x2f\\x2f\\x38\\x2f\\x77\\x33\\x38\\x47\\x49\\x41\\x58\\x44\\x49\\x42\\x4b\\x45\\x30\\x44\\x48\\x78\\x67\\x6c\\x6a\\x4e\\x42\\x41\\x41\\x4f\\x39\\x54\\x58\\x4c\\x30\\x59\\x34\\x4f\\x48\\x77\\x41\\x41\\x41\\x41\\x42\\x4a\\x52\\x55\\x35\\x45\\x72\\x6b\\x4a\\x67\\x67\\x67\\x3d\\x3d\\x22\\x0a\\x54\\x68\\x61\\x6e\\x6b\\x20\\x79\\x6f\\x75\\x21\\x3a\\x9a\\x01\\x1a\\x08\\x47\\x72\\x65\\x65\\x74\\x69\\x6e\\x67\\x22\\x06\\x48\\x65\\x61\\x64\\x65\\x72\\x2a\\x04\\x42\\x6f\\x64\\x79\\x32\\x06\\x46\\x6f\\x6f\\x74\\x65\\x72\\x3a\\x0c\\x53\\x69\\x6e\\x67\\x6c\\x65\\x41\\x6e\\x73\\x77\\x65\\x72\\x4a\\x12\\x1a\\x07\\x4f\\x70\\x74\\x69\\x6f\\x6e\\x31\\x22\\x07\\x4f\\x70\\x74\\x69\\x6f\\x6e\\x31\\x4a\\x14\\x08\\x02\\x1a\\x07\\x4f\\x70\\x74\\x69\\x6f\\x6e\\x32\\x22\\x07\\x4f\\x70\\x74\\x69\\x6f\\x6e\\x32\\x4a\\x14\\x08\\x04\\x1a\\x07\\x4f\\x70\\x74\\x69\\x6f\\x6e\\x33\\x22\\x07\\x4f\\x70\\x74\\x69\\x6f\\x6e\\x33\\x4a\\x14\\x08\\x06\\x1a\\x07\\x4f\\x70\\x74\\x69\\x6f\\x6e\\x34\\x22\\x07\\x4f\\x70\\x74\\x69\\x6f\\x6e\\x34\\x4a\\x14\\x08\\x08\\x1a\\x07\\x4f\\x70\\x74\\x69\\x6f\\x6e\\x35\\x22\\x07\\x4f\\x70\\x74\\x69\\x6f\\x6e\\x35\\x4a\\x06\\x75\\x72\\x67\\x65\\x6e\\x74\\x52\\x09\\x6c\\x69\\x67\\x68\\x74\\x6e\\x69\\x6e\\x67\\x32\\x06\\x12\\x04\\x6e\\x6f\\x6e\\x65
>
> > a.bin
>
> ```
>
> When I add this file as a resource to my C++ WebAssembly app, and load it,
> everything works fine :
> ```cpp
>
> euf_proto::PubDetails pubDetails;
> QByteArray data;
> {
> QString fileName(":/a.bin");
>
> QFile file(fileName);
> if(!file.open(QIODevice::ReadOnly)) {
> qDebug() << "file not opened";
> }
> else
> {
> qDebug() << "file opened";
> data = file.readAll();
> }
> }
>
>
>
> if (pubDetails.ParseFromArray(data.data(), data.size()))
> {
> qDebug() << "C++ : Successfully parsed new pubDetails: " << data;
> }
> else
> {
> qDebug() << "C++ : Failed to parse new pubDetails: " << data;
> }
>
> =>
>
> file opened
>
> qtloader.js:382 C++ : Successfully parsed new pubDetails:
> "*\xD2\x02\x1A\x93\x01\n\fEmitter Name\x12\rEmitter
> Title\x1AtiVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==\"\nThank
>
> you!:\x9A\x01\x1A\bGreeting\"\x06Header*\x04""Body2\x06""Footer:\fSingleAnswerJ\x12\x1A\x07Option1\"\x07Option1J\x14\b\x02\x1A\x07Option2\"\x07Option2J\x14\b\x04\x1A\x07Option3\"\x07Option3J\x14\b\x06\x1A\x07Option4\"\x07Option4J\x14\b\b\x1A\x07Option5\"\x07Option5J\x06urgentR\tlightning2\x06\x12\x04none"
>
> So basically this means that the protobuf message gets correctly generated
> on the Javascript side, and even the wire format output is correct as well.
> So the issue is with passing this to C++ somehow.
>
> I tried to encode it as hex on the Javascript side, and decode it on the
> C++ side, but it didn't help.
> On Friday, February 18, 2022 at 11:39:13 AM UTC+1 Csaba Szigeti wrote:
>
>> In case if I modify my code, so it is passing a simple string as logo,
>> then I can successfully parse the protobuf message on the C++ side :
>> ```javascript
>> ...
>> internal.setLogo("logo")
>> ...
>> ```
>>
>> So I guess that the issue is with this field. The original string is a
>> base64 encoded image. What should I do with this string to fix the parsing?
>>
>> On Thursday, February 17, 2022 at 8:49:38 PM UTC+1 [email protected]
>> wrote:
>>
>>> If only UTF-8 messages are being parsed successfully, then that sounds
>>> like a clue to me that you probably need to base64-encode the serialized
>>> message. I have only limited experience with JavaScript, but from what I
>>> understand, JavaScript strings can only represent Unicode and not raw
>>> binary data. So if you need to store raw binary in a JavaScript string then
>>> you probably want to base64-encode it (and then decode it on the other side
>>> before parsing the message).
>>>
>>> On Thu, Feb 17, 2022 at 11:28 AM Csaba Szigeti <[email protected]>
>>> wrote:
>>>
>>>> I am really sorry. Posting again with correct formatting this time :
>>>>
>>>> I would like to pass a protobuf message from Javascript to a C++
>>>> WebAssembly module.
>>>>
>>>> I do receive, and can successfully parse the simpler protobuf messages
>>>> on the C++ side, however, protobuf is failing to parse the less-simple
>>>> protobuf messages.
>>>>
>>>> Here is the code that I am using :
>>>>
>>>> ```javascript
>>>> goog.module('protobufMessageGenerator');
>>>> goog.require('proto.my_proto.MyMessage');
>>>>
>>>> function generateMyMessage() {
>>>> var msg = new proto.my_proto.MyMessage()
>>>> var internal = new proto.my_proto.MyMessageInternal()
>>>> internal.setAccentColor("#CC1D24")
>>>>
>>>> internal.setLogo("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")
>>>> msg.setInternal(internal)
>>>> return msg
>>>> }
>>>> ```
>>>>
>>>> Using the google-closure-compiler, I compile this protobuf message
>>>> generator to pure Javascript.
>>>> I use this code to pass the message to the C++ WebAssembly module :
>>>>
>>>> ```javascript
>>>> function sendMessage() {
>>>>
>>>> Module.self().setMyMessage(module$contents$protobufMessageGenerator_generateMyMessage().serializeBinary())
>>>> }
>>>> sendMessage()
>>>> ```
>>>>
>>>> I receive the message on the C++ side using this code :
>>>>
>>>> ```cpp
>>>> void JavascriptPublicInterface::setMyMessage(const QString &myMessage)
>>>> {
>>>> if (_myMessage != myMessage)
>>>> {
>>>> _myMessage = myMessage;
>>>> emit myMessageChanged();
>>>> }
>>>> }
>>>>
>>>> void JavascriptPublicInterface::setMyMessageEMS(const std::string
>>>> &myMessage)
>>>> {
>>>> setMyMessage(QString::fromStdString(myMessage));
>>>> }
>>>>
>>>> //...
>>>>
>>>> void startListeningToMyMessage(std::function<void(euf_proto::MyMessage
>>>> myMessage)> listener)
>>>> {
>>>> const auto changedListener = [listener]() {
>>>> const auto newMyMessageString =
>>>> JavascriptPublicInterface::self()->myMessage();
>>>> my_proto::MyMessage myMessagePb;
>>>> if
>>>> (myMessagePb.ParseFromString(newMyMessageString.toStdString()))
>>>> {
>>>> qDebug() << "C++ : Successfully parsed new
>>>> MyMessage: " << newMyMessageString;
>>>> }
>>>> else
>>>> {
>>>> qDebug() << "C++ : Failed to parse new
>>>> MyMessage: " << newMyMessageString;
>>>> }
>>>>
>>>> qDebug() << "MyMessage received: " <<
>>>> QString::fromStdString(myMessagePb.DebugString());
>>>>
>>>> listener(myMessagePb);
>>>> };
>>>> if (!QObject::connect(JavascriptPublicInterface::self(),
>>>> &JavascriptPublicInterface::myMessageChanged, changedListener))
>>>> {
>>>> throw std::runtime_error("Failed to connect to
>>>> JavascriptPublicInterface myMessageChanged");
>>>> }
>>>> }
>>>> ```
>>>>
>>>> In the Javascript console I see : "C++ : Failed to parse new MyMessage:
>>>> ..."
>>>>
>>>> I guess that it can be related to the fact that Javascript is using
>>>> UTF-16 and C++ is using UTF-8 encoding (because the messages that are
>>>> UTF-8
>>>> only can be successfully parsed), so I tried to fix the sending and
>>>> receiving like this:
>>>>
>>>> ```javascript
>>>> //For more info see :
>>>> https://emscripten.org/docs/api_reference/emscripten.h.html?highlight=stringtoutf8
>>>> function convertUtf16ToUtf8(input) {
>>>> var uint8Arr = input
>>>> var jsString = String.fromCharCode.apply(null, uint8Arr)
>>>> var lengthBytes = lengthBytesUTF8(jsString)+1
>>>> var stringOnWasmHeap = _malloc(lengthBytes)
>>>> stringToUTF8(jsString, stringOnWasmHeap, lengthBytes)
>>>> return stringOnWasmHeap
>>>> }
>>>>
>>>> function sendMessage() {
>>>> var myMessage =
>>>> convertUtf16ToUtf8(module$contents$protobufMessageGenerator_generateMyMessage().serializeBinary())
>>>> Module.self().setMyMessage(myMessage)
>>>> _free(myMessage)
>>>> }
>>>> sendMessage()
>>>> ```
>>>>
>>>> And I modified the parsing on the C++ side like this :
>>>>
>>>> ```cpp
>>>> void JavascriptPublicInterface::setMyMessageEMS(const int pointer)
>>>> {
>>>> const char* msg = (char*)pointer;
>>>> setMyMessage(QString::fromStdString(msg));
>>>> }
>>>> ```
>>>>
>>>> But I still get this error : "C++ : Failed to parse new MyMessage: ..."
>>>>
>>>> How could I fix this?
>>>>
>>>> (I am using protobuf 3.19.1 (same version on both the Javascript and
>>>> the C++ side).)
>>>>
>>>> On Thursday, February 17, 2022 at 8:25:26 PM UTC+1 Csaba Szigeti wrote:
>>>>
>>>>> I would like to pass a protobuf message from Javascript to a C++
>>>>> WebAssembly module.
>>>>>
>>>>> I do receive, and can successfully parse the simpler protobuf messages
>>>>> on the C++ side, however, protobuf is failing to parse the less-simple
>>>>> protobuf messages.
>>>>>
>>>>> Here is the code that I am using :
>>>>> ```
>>>>> goog.module('protobufMessageGenerator');
>>>>> goog.require('proto.my_proto.MyMessage'); function generateMyMessage() {
>>>>> var msg = new proto.my_proto.MyMessage() var internal = new
>>>>> proto.my_proto.MyMessageInternal() internal.setAccentColor("#CC1D24")
>>>>> internal.setLogo("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")
>>>>>
>>>>> msg.setInternal(internal) return msg }
>>>>> ```
>>>>> Using the google-closure-compiler, I compile this protobuf message
>>>>> generator to pure Javascript. I use this code to pass the message to the
>>>>> C++ WebAssembly module :
>>>>> ```
>>>>> function sendMessage() {
>>>>> Module.self().setMyMessage(module$contents$protobufMessageGenerator_generateMyMessage().serializeBinary())
>>>>>
>>>>> } sendMessage()
>>>>> ```
>>>>> I receive the message on the C++ side using this code :
>>>>> ```
>>>>> void JavascriptPublicInterface::setMyMessage(const QString &myMessage)
>>>>> { if (_myMessage != myMessage) { _myMessage = myMessage; emit
>>>>> myMessageChanged(); } } void
>>>>> JavascriptPublicInterface::setMyMessageEMS(const std::string &myMessage)
>>>>> {
>>>>> setMyMessage(QString::fromStdString(myMessage)); } //... void
>>>>> startListeningToMyMessage(std::function<void(euf_proto::MyMessage
>>>>> myMessage)> listener) { const auto changedListener = [listener]() { const
>>>>> auto newMyMessageString = JavascriptPublicInterface::self()->myMessage();
>>>>> my_proto::MyMessage myMessagePb; if
>>>>> (myMessagePb.ParseFromString(newMyMessageString.toStdString())) {
>>>>> qDebug()
>>>>> << "C++ : Successfully parsed new MyMessage: " << newMyMessageString; }
>>>>> else { qDebug() << "C++ : Failed to parse new MyMessage: " <<
>>>>> newMyMessageString; } qDebug() << "MyMessage received: " <<
>>>>> QString::fromStdString(myMessagePb.DebugString()); listener(myMessagePb);
>>>>> }; if (!QObject::connect(JavascriptPublicInterface::self(),
>>>>> &JavascriptPublicInterface::myMessageChanged, changedListener)) { throw
>>>>> std::runtime_error("Failed to connect to JavascriptPublicInterface
>>>>> myMessageChanged"); } }
>>>>> ```
>>>>>
>>>>>
>>>>> In the Javascript console I see : "C++ : Failed to parse new
>>>>> MyMessage: ..."
>>>>>
>>>>> I guess that it can be related to the fact that Javascript is using
>>>>> UTF-16 and C++ is using UTF-8 encoding (because the messages that are
>>>>> UTF-8
>>>>> only can be successfully parsed), so I tried to fix the sending and
>>>>> receiving like this:
>>>>>
>>>>> ```
>>>>> //For more info see :
>>>>> https://emscripten.org/docs/api_reference/emscripten.h.html?highlight=stringtoutf8
>>>>>
>>>>> function convertUtf16ToUtf8(input) { var uint8Arr = input var jsString =
>>>>> String.fromCharCode.apply(null, uint8Arr) var lengthBytes =
>>>>> lengthBytesUTF8(jsString)+1 var stringOnWasmHeap = _malloc(lengthBytes)
>>>>> stringToUTF8(jsString, stringOnWasmHeap, lengthBytes) return
>>>>> stringOnWasmHeap } function sendMessage() { var myMessage =
>>>>> convertUtf16ToUtf8(module$contents$protobufMessageGenerator_generateMyMessage().serializeBinary())
>>>>>
>>>>> Module.self().setMyMessage(myMessage) _free(myMessage) } sendMessage()
>>>>> ```
>>>>> And I modified the parsing on the C++ side like this :
>>>>> ```
>>>>> void JavascriptPublicInterface::setMyMessageEMS(const int pointer) {
>>>>> const char* msg = (char*)pointer;
>>>>> setMyMessage(QString::fromStdString(msg)); }
>>>>> ```
>>>>>
>>>>> But I still get this error : "C++ : Failed to parse new MyMessage: ..."
>>>>>
>>>>> How could I fix this?
>>>>>
>>>>> (I am using protobuf 3.19.1 (same version on both the Javascript and
>>>>> the C++ side).)
>>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Protocol Buffers" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/protobuf/9ce5f69e-b6de-4627-b8e1-71b68da574b3n%40googlegroups.com
>>>>
>>>> <https://groups.google.com/d/msgid/protobuf/9ce5f69e-b6de-4627-b8e1-71b68da574b3n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>
--
You received this message because you are subscribed to the Google Groups
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/protobuf/ad7ea3c2-5baf-492f-8c3a-23e2d79078fen%40googlegroups.com.