【问题标题】:Chrome Extension using NativeMessaging cannot receive some kind of json data使用 NativeMessaging 的 Chrome 扩展无法接收某种 json 数据
【发布时间】:2026-02-21 03:45:01
【问题描述】:

Chrome 扩展使用原生消息接收 json 数据:

var port = chrome.runtime.connectNative('company.my_application');  
port.onMessage.addListener(function(result) { 
    console.log(result);
}); 

在我的C++程序中,如果我发送一个json字符串str1[],扩展可以接收它,但是如果我发送str2[],扩展不能接收它。 这个字符串有问题吗?

str2[]代表一个长字符串,它是一个正确的Json数据,但不能被扩展接受。
有没有人遇到过同样的问题并解决了?

char str1[]="{\"Func\":\"test\",\"msg\":\"hello\"}";

char str2[]="{\"Func\":\"test\",\"msg\":\"3c476c6f62616c4a53206d6f64756c6549643d226f7261636c652e6f6174732e736372697074696e672e6d6f64756c65732e616466223e3c215b43444154415b2f2a2061616161616161616161616161616161612061616161616161612061616161616161616161206161616161202a2f262378443b262378413b262378443b262378413b616161616161616120616161616161616161616161616161616161616161616161616161612861612c6161616161297b262378443b262378413b096161617b262378443b262378413b090961616120616161613d61616161616161286161293b262378443b262378413b09096161616161203d206161616161616161286161616161293b262378443b262378413b0909616128276161616161273d3d6161616161616161616161616161616161616161616161616161616161612861612c27616161616161616161616161616161616120616161616161616161616161616161616161616161616161616161612729297b262378443b262378413b09090961616120616161616161616161613d2861616161613d3d616161613f27273a6161616161293b262378443b262378413b09090961616120616161613d616161612e6161616161616128293b262378443b262378413b09090961616120616161616161616161616161203d20616161612e5f6161616161616161616161616161612861616161293b262378443b262378413b090909616120286161616161616161616161612e61616161612e616161616161613d3d22616161616122297b262378443b262378413b090909096161616161616161616161612e616161616128293b262378443b262378413b0909097d262378443b262378413b090909616161612e5f6161616161616161616161616161616161612861616161292e6161616161203d20616161616161616161613b262378443b262378413b090909616161612e5f616161616161616161616161616161616161616161286161616161616161616161612c2061616161616161616161293b262378443b262378413b0909096161616161616161616161612e6161616128293b262378443b262378413b09097d616161617b262378443b262378413b0909096161616161616161616161616161616161612e6161612827616161616161616161616161616161616120616161616161616161616161616161616161616161616161616161612061616161616161616120616120616161612061612061616161616161612061612061616161616161612e2e2e2e61613a272b61612c6161616161616161616161616161616161612e61616161615f6161616161293b262378443b262378413b09097d0909262378443b262378413b202020207d616161616128616161297b262378443b262378413b20202020096161616161616161616161616161616161612e6161612827616161616161616161616161616161616120616161616161616161616161616161616161616161616161616161612061616161613a272b6161612e61616161616161616161612b272e2e2e2e61613a272b61612c6161616161616161616161616161616161612e61616161615f6161616161293b262378443b262378413b202020207d262378443b262378413b7d262378443b262378413b262378443b262378413b2f2a206161616161616161616161616161616161206161616161616161206161616161616161616120616161202a2f262378443b262378413b5d5d3e3c2f476c6f62616c4a533e\"}";

我正在尝试按如下方式发送长度和消息:

size_t len = strlen(str2);
cout.write(str2, len);
fflush(stdout);

我已经使用这些方式发送长度:

    cout.write((char*)&len, 4);

    putchar ((( char *) &len) [0]);
    putchar ((( char *) &len) [1]);
    putchar ((( char *) &len) [2]);
    putchar ((( char *) &len) [3]);

    putchar(char(((len >> 0) & 0xFF)));
    putchar(char(((len >> 8) & 0xFF)));
    putchar(char(((len >> 16) & 0xFF)));
    putchar(char(((len >> 24) & 0xFF)));

【问题讨论】:

  • 这是一个非常长的字符串,你可能不会得到很好的回应。
  • c++ 程序不需要任何扩展响应。希望扩展能够通过nativeMassaging接收到这个json数据并显示出来。
  • 我的意思是在 Stack Overflow 上发帖,这样的数字墙很难看。
  • 抱歉误读了您的评论... str2[] 代表长字符串,它是正确的 Json 数据,但不能被扩展接受。也许有人遇到同样的问题并解决它。
  • 也许您没有正确发送尺寸。仔细检查您的尺寸计算。或者更好的是,在此处包含代码。

标签: c++ json windows google-chrome-extension chrome-native-messaging


【解决方案1】:

[OP 的解决方案转换为下面的答案]

感谢大家的cmets,我现在已经解决了这个问题。

原因

str[] 的长度是2601(0x29 0x0a 0x00 0x00)。我的 IO 会自动在0x0a 之前插入Ox0d,所以我的输出长度变成了5 个字节,(0x29 0x0d 0x0a 0x00 0x00)

解决方案

更改 IO 模式。

#include<io.h>
#include<fcntl.h>
_setmode(fileno(stdout), O_BINARY);

【讨论】:

    【解决方案2】:

    你应该使用

    unsigned int len = strlen(str2);
    

    而不是

    size_t len = strlen(str2);
    

    native messaging 协议要求消息前面有一个 32 位整数,而size_t 的位大小取决于实现。例如,在我的 64 位系统上,sizeof(size_t) 是 8(字节)。

    【讨论】:

    • 你是对的。使用 unsigned int 比 size_t 好。我已经修复了,但不是这个原因,分机还是收不到,
    • @MinYang 你能在你的问题中展示你的完整程序(至少是相关部分)吗?我从您的问题中提取了字符串并将size_t 更改为unsigned int did 为我解决了问题。
    • 我在 c++ 程序线程中运行这些代码: char str[];//str2 unsigned int Len = strlen(str); putchar(char(((Len >> 0) & 0xFF))); putchar(char(((Len >> 8) & 0xFF))); putchar(char(((Len >> 16) & 0xFF))); putchar(char(((Len >> 24) & 0xFF))); printf("%s",str); fflush(stdout);
    • @MinYang 改用cout.write(reinterpret_cast&lt;char*&gt;(&amp;Len), 4);
    • @MinYang 在您的问题中添加一个可编译的最小示例。否则我不能再帮你了。