Не работает макрос Log4cxx, строка содержит нулевой символ - PullRequest
1 голос
/ 26 мая 2011

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

одно сообщение выглядит так:

ab 40 01 00 00 00 ff f0 00 00 00 00 09 01 01 07 00 00 c0 a8 04 54ая.

сначала я попробовал с char * pMsg, затем я сделал что-то подобное, используя std string str (pMsg), оба не работают.

затем я сделал что-то подобное

   char chMsg[MAX_PATH];
   while(i<nBuffLen)
   {
    chMsg[i] = *(pMsgBuff+i);
    i++;
   }

Весь подход не работает, и в результате получается

  1. , он правильно печатает первые три байта и ни один после этого.
  2. Некоторое время вызов LOG4CXX_INFO приводит к сбою приложения.

Я использую макрос LOG4CXX_INFO для регистрации информации.

Кажется, это из-за символа NULL в четвертом поле.Я нашел эту ссылку, которая утверждает, что решить проблему, но я попробовал тот же код с LOG4CXX_INFO, это сбой.https://issues.apache.org/jira/browse/LOGCXX-162

Как решить эту проблему?

1 Ответ

0 голосов
/ 26 мая 2011

Обратите внимание, что вы не строите std::string надлежащим образом.

Когда вы вызываете std::string(chMsg) напрямую, задействуется вызов strlen, чтобы определить длину передаваемой C-строки. К сожалению, в вашем случае C-строка по определению в стандарте C - это серия символов, оканчивающаяся нулевым символом.

Однако есть и другие std::string конструкторы:

  • std::string(char const*, size_t) позволяет вам указать длину буфера.
  • std::string(InputIt, InputIt) можно использовать с двумя указателями, ограничивающими буфер.

(подробнее на cplusplus.com )

Если вы используете любой из них, то std::string будет содержать нулевые символы, а не останавливаться на первом из них, и поэтому он должен быть напечатан правильно.

...