如何从Chrome扩展程序发送消息到本机应用程序?

时间:2013-11-26 07:40:31

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

我有一个用c ++编写的本机应用程序。

我可以使用How to send message FROM native app TO Chrome extension?

将我的原生应用中的数据发送到Chrome扩展程序

但我无法找到另一种方式。

Chrome文档。状态: Chrome在单独的进程中启动每个本机消息传递主机,并使用标准输入(stdin)和标准输出(stdout)与其进行通信。相同的格式用于在两个方向上发送消息:使用JSON,UTF-8编码序列化每个消息,并以原生字节顺序开头的32位消息长度。

如何读取/解释由chrome-extension发送的stdin数据?

如何读取4字节长度信息以及UTF-8编码的其余数据?

请帮忙!

谢谢!

2 个答案:

答案 0 :(得分:3)

正如评论中提到的那样,如果长度大于255 ,则提供的解决方案将无效。例如,如果实际长度是296(二进制00000001 00101000),则先前呈现的解决方案将产生41 => 00000001 + 00101000 = 1 + 40 = 41。

必须考虑读取的字节数。在这个例子中,计算长度的正确方法是1 *(2 ^ 8)+ 40 = 296.所以正确的解决方案可能是:

unsigned int length = 0;

//read the first four bytes
for (int i = 0; i < 4; i++) {
  int read_char = getchar();
  length += read_char * (int) pow(2.0, i * 8);
}

基于位移位操作的更好解决方案如下所示(可能有点难以理解,但肯定更整洁):

unsigned int length = 0;

for (int i = 0; i < 4; i++) {
  unsigned int read_char = getchar();
  length = length | (read_char << i * 8);
}

重要的是要注意getchar()返回在转换为当前值为length的位OR之前转换为unsigned int的int(int有一位为sign保留,unsigned int则没有)。

现在,我不确定这里可能出现的潜在的大/小端问题,因为我没有在不同的架构上测试过这个解决方案。我希望有经验的人能对此发表评论。

答案 1 :(得分:1)

从stdin读取json数据:

int _tmain(int argc, _TCHAR* argv[])
{

unsigned int length = 0;
//read the first four bytes (=> Length)
for (int i = 0; i < 4; i++)
{
    length += getchar();
}

//read the json-message
string msg = "";
for (int i = 0; i < length; i++)
{
    msg += getchar();
}
}