2

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

我可以使用如何将消息从本机应用程序发送到 Chrome 扩展程序将数据从我的本机应用程序发送到 chrome 扩展程序?

但我无法弄清楚其他方式。

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

如何从标准输入读取/解释由 chrome 扩展发送的数据?

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

请帮忙!

谢谢!

4

2 回答 2

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() 返回的 int 在执行与当前长度值的位或之前被强制转换为 unsigned int (int 为符号保留一位,unsigned int 没有)。

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

于 2014-10-01T11:40:52.350 回答
1

从标准输入读取 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();
}
}
于 2013-11-26T10:00:26.020 回答