2015-10-31 2 views
1

Я пишу расширение для Chrome, которое использует собственную передачу сообщений хоста. Цель состоит в том, чтобы открывать ссылки Chrome в браузере по умолчанию ОС при работе в режиме приложения. Chrome реализует передачу собственных хостов через каналы в stdin и stdout собственного приложения. Все это хорошо и хорошо, и у меня есть расширение, говорящее с родным приложением. Проблема, с которой я сталкиваюсь, состоит в том, что первые 4 байта данных содержат длину следующей строки, которая для моих целей всегда будет содержать нулевые символы. Пример strace показан ниже. Каков наилучший способ справиться с этим? Я хотел бы использовать что-то вроде cin или getline, что остановит программу до тех пор, пока вход не будет получен, если это возможно.Работа с нулевыми символами в stdin в C++

Process 27964 attached 
read(0, "~\0\0\0\"http://stackoverflow.com/qu"..., 4096) = 130 
read(0, 

Это текущий код на C++. Я пробовал варианты с помощью cin.get и fgets, но они не ждут ввода и Chrome убивает программу после того, как цикл запускается amok.

#include <string> 
#include <iostream> 
using namespace std; 

int main(int argc, char* argv[]) { 
    for(;;) { 
     string message; 
     cin >> message; 
     if(!message.length()) break; 
     string cmd(string("xdg-open ") + message); 
     system(cmd.c_str()); 
    } 
    return 0; 
} 
+1

Пожалуйста, разместите код. –

ответ

1

Насколько я понимаю here, длина должна быть в родной порядок байтов, так же порядок байт, который использует компилятор для той же архитектуры процессора:

each message is serialized using JSON, UTF-8 encoded and is preceded with 32-bit message length in native byte order.

Это означает, что вы могли читать сначала длина:

uint32_t len; 
while (cin.read(reinterpret_cast<char*>(&len), sizeof (len))) // process the messages 
{ 
    // you know the number of bytes in the message: just read them 
    string msg (len, ' '); // string filled with blanks 
    if (!cin.read(&msg[0], len)) 
     /* process unexpected error of missing bytes */; 
    else /* process the message normally */ 
} 
+0

Компилятору это не нравится. 'ошибка: нет соответствующей функции для вызова в 'std :: basic_istream :: read (uint32_t *, long unsigned int)'' 'примечание: неизвестное преобразование для аргумента 1 из 'uint32_t * {aka unsigned int *}' to 'std :: basic_istream :: char_type * {aka char *}' ' –

+0

@ spike.barnett К сожалению, для компиляции с ожиданиями read() требуется бросок. Я отредактировал. – Christophe

+0

Это сделало трюк, благодаря кучу. Кроме того, я даже не знал, что существует reinterpret_cast. Я должен буду это прочитать. –

Смежные вопросы