質問のタイトルがわかりにくくてすみません。私は試した ;)
- 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 には実際には何もありません。data
length
"\\0000"
split()
map()
join()
"\\000"
架空の関数型言語では、次のようになります。
join("\\000",
map(lambda(chunk){encode(chunk)}, split('\0', data)))
ベテランの C プログラマーは、私が書く必要があるようなルーチンをどのように作成しますか?