Как отправить сообщение ОТ расширения Chrome В приложение Native?

У меня есть native-приложение, написанное на c ++.

Я могу отправлять данные из моего native-приложения в расширение Chrome с помощью Как отправить сообщение из родного приложения в расширение Chrome?

Но я не могу понять другой путь.

Хром док. состояния : Chrome запускает каждый собственный узел обмена сообщениями в отдельном процессе и связывается с ним, используя стандартный ввод (stdin) и стандартный вывод (stdout). Один и тот же формат используется для отправки сообщений в обоих направлениях: каждое сообщение сериализуется с использованием JSON в кодировке UTF-8 и ему предшествует 32-битная длина сообщения в собственном байтовом порядке.

как я могу прочитать / интерпретировать данные из стандартного ввода, отправленные расширением chrome?

Как прочитать информацию о длине 4 байта, а также остальные данные, которые отправляются в кодировке UTF-8?

Пожалуйста помоги!

Спасибо!

1

Решение

Чтобы прочитать данные json из stdin:

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();
}
}
1

Другие решения

Как кто-то упомянул в комментариях, предоставленное решение не будет работать, если длина больше 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 перед выполнением бита OR с текущим значением длины (int имеет один бит, зарезервированный для знака, unsigned int — нет).

Теперь я не уверен в возможных проблемах с прямым и прямым порядком байтов, которые могут возникнуть здесь, поскольку я не тестировал это решение на разных архитектурах. Я надеюсь, что кто-то с большим опытом может прокомментировать это.

3