我有一个用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编码的其余数据?
请帮忙!
谢谢!
答案 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();
}
}