現在、特殊文字を渡して、シリアル化された文字列の最後に到達したことを受信側に伝えようとしているようです。これであなたを台無しにすることができる百万のケースがあります:
構造体にその特殊文字と等しいバイトが含まれている場合はどうなりますか。別の特殊文字でエスケープします。構造体に、エスケープ文字の後に特殊文字が続くバイトシーケンスが含まれている場合は、それも確認してください。
ええ、それは実行可能ですが、それはあまり良い解決策ではないと思います。エスケープ文字を探すためにパーサーを作成する必要があります。その後、コードを見る人は、何が起こっているのかを理解するために2時間を費やします。 。
(tl; dr)代わりに...シリアル化された文字列の最初の32ビットを文字列のバイト数と等しくするだけです。これは、シリアル化ごとに4バイトしかかからず、すべての問題を解決します。パーサーを記述したり、特殊文字について心配したりする必要はなく、コードを読み通す次の人にとって非常に簡単になります。
編集
JeremyPのおかげで、私はあなたの質問に本当に答えていないことに気づきました。すべての文字列に対してこれらの人の1人を送ってください:
struct s_str {bool is_null; intサイズ; char * str; };
nullの場合は、is_nullをtrueに設定するだけで、他の2つについて心配する必要はありません。サイズがゼロの場合は、is_nullをfalseに設定し、サイズをゼロに設定します。strに「\0」だけが含まれている場合は、is_nullをfalseに、サイズを1に、str[0]を「\0」に設定します。
私の意見では、これは最もメモリ効率の良い方法ではないかもしれませんが(おそらくどこかでバイトを節約できます)、あなたがしていることは間違いなく非常に明確です。