2

質問のタイトルがわかりにくくてすみません。私は試した ;)

  • nul バイトを含むバイナリ文字列があります
  • 糸の長さが分かります。
  • 関数 (ライブラリから) を使用して、文字列を別の形式にエンコードします。
  • ライブラリ関数を使用してバイナリ文字列をエンコードする必要があります。
  • ライブラリ関数は長さを受け入れず、文字列がヌルで終了していると想定します。
  • nulバイトを手でエンコードする方法を知っています(それらを として表します"\\000"

擬似コードを見てください:

/* I have a string, and the length in bytes of that string */
char * data   = value->bytes;
long   length = value->length;

/* I need to use a function, but it doesn't handle embedded nuls */
char * encoded = lib_func_encode(data);
lib_free(encoded); // library function requires a free() routine be called

ライブラリ関数は最初の nul バイトまでの最初のチャンクのみをエンコードするため、これは機能しません。strlen() を呼び出し続け、バイトがエンコードされるまでカウントし続け、さらにバイトをエンコードする必要があるたびに文字列を追加し、エンコードされたデータの余分なチャンクを収容するためにバッファーを再割り当てするdata、かなり恐ろしいループを作成できます。これは、かなり単純な問題を回避するための大量のコードになると思われます。(nul バイトで) (各チャンクをエンコードする) や(を使用して) のような概念を持つ言語から来て、私はその方法で最もクリーンなソリューションについて本能的に考えています... しかし、そのようなことを行うための標準 C には実際には何もありません。datalength"\\0000"split()map()join()"\\000"

架空の関数型言語では、次のようになります。

join("\\000",
     map(lambda(chunk){encode(chunk)}, split('\0', data)))

ベテランの C プログラマーは、私が書く必要があるようなルーチンをどのように作成しますか?

4

2 に答える 2

2

複数のステップでそれを行うことができます:

  1. 埋め込まれたすべてのヌルバイトを見つける
  2. これと長さから、新しい文字列の長さを計算できます
  3. 計算された長さの新しい文字列を割り当てます
  4. すべての非ヌル文字をコピーするバイナリ文字列を反復し、ヌル文字に到達すると特殊文字シーケンスを挿入します
  5. 新しい文字列を終了
  6. 新しい文字列でライブラリ関数を呼び出す
  7. 新しい文字列を解放する
于 2012-10-11T08:17:02.410 に答える
1

あなたができる簡単なことは、最後のnull(文字列ターミネータ)を除いて、長さまでsだけreplaceにすることです。null byteを置き換えたらnulls、置き換えられた文字列で必要なことを行うことができます。

于 2012-10-11T08:35:36.023 に答える