1

私はクライアントサーバーアプリケーションに取り組んでいます。サーバーからデータを送信およびクエリするためのプロトコル形式があります。ここで、サーバーとの間で送受信されるデータをログ ファイルに記録する必要があります。Log4cxx の最新バージョンを使用しています。ただし、このバイナリ データには null 文字も含まれています。

1 つのメッセージは次のようにロックされます。

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

最初に char* pMsg で試した後、標準文字列 str(pMsg ) を使用してこのようなことを行いました。両方とも機能していません。

それから私はこのようなことをしました

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

すべてのアプローチが機能せず、結果は

  1. 最初の 3 バイトは正しく出力され、その後は何も出力されません。
  2. LOG4CXX_INFO を何度か呼び出すと、アプリケーションがクラッシュします。

LOG4CXX_INFO マクロを使用して情報を記録しています。

4番目のフィールドのNULL文字が原因のようです。問題が解決されたと主張するこのリンクを見つけましたが、クラッシュしている LOG4CXX_INFO で同じコードを試しました。 https://issues.apache.org/jira/browse/LOGCXX-162

この問題を解決するには?

4

1 に答える 1

0

std::stringを適切に構築していないことに注意してください。

std::string(chMsg)直接呼び出すstrlenと、渡された C-String の長さを決定するための呼び出しが含まれます。残念ながら、あなたの場合、C-StringはC標準の定義により、ヌル文字で終わる一連の文字です。

ただし、他のstd::stringコンストラクターがあります。

  • std::string(char const*, size_t)バッファの長さを正確に指定できます。
  • std::string(InputIt, InputIt)バッファーを区切る 2 つのポインターと共に使用できます。

( cplusplus.comで詳細を参照してください)

これらのいずれかを使用するstd::stringと、最初の文字で停止するのではなくヌル文字が含まれるため、正しく出力されるはずです。

于 2011-05-26T07:36:59.390 に答える