У меня есть native-приложение, написанное на c ++.
Я могу отправлять данные из моего native-приложения в расширение Chrome с помощью Как отправить сообщение из родного приложения в расширение Chrome?
Но я не могу понять другой путь.
Хром док. состояния : Chrome запускает каждый собственный узел обмена сообщениями в отдельном процессе и связывается с ним, используя стандартный ввод (stdin) и стандартный вывод (stdout). Один и тот же формат используется для отправки сообщений в обоих направлениях: каждое сообщение сериализуется с использованием JSON в кодировке UTF-8 и ему предшествует 32-битная длина сообщения в собственном байтовом порядке.
как я могу прочитать / интерпретировать данные из стандартного ввода, отправленные расширением chrome?
Как прочитать информацию о длине 4 байта, а также остальные данные, которые отправляются в кодировке UTF-8?
Пожалуйста помоги!
Спасибо!
Чтобы прочитать данные 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();
}
}
Как кто-то упомянул в комментариях, предоставленное решение не будет работать, если длина больше 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 — нет).
Теперь я не уверен в возможных проблемах с прямым и прямым порядком байтов, которые могут возникнуть здесь, поскольку я не тестировал это решение на разных архитектурах. Я надеюсь, что кто-то с большим опытом может прокомментировать это.