看起来您当前正试图通过向接收端传递一个特殊字符来告诉接收端已到达序列化字符串的末尾。有一百万个案例会让你大吃一惊:
如果您的结构包含一个等于该特殊字符的字节怎么办。用另一个特殊字符转义它。如果您的结构包含一个字节序列,该字节序列等于您的转义字符后跟您的特殊字符,也要检查一下吗?
是的,这是可行的,但我认为这不是一个很好的解决方案,你必须编写一个解析器来查找转义字符,然后任何稍后查看代码的人都会花两个小时试图弄清楚发生了什么.
(tl;dr) 相反......只需使序列化字符串的前 32 位等于字符串中的字节数。每次序列化只需要 4 个字节,解决了所有问题,您不必编写解析器或担心特殊字符,并且会让下一个阅读您的代码的人更容易!
编辑
感谢 JeremyP,我刚刚意识到我并没有真正回答你的问题。为每个字符串发送其中一个:
结构 s_str { bool is_null; 整数大小;字符* str; };
如果它为空,只需将 is_null 设置为 true,您就不必担心其他两个。如果它的大小为零,请将 is_null 设置为 false 并将大小设置为零。如果 str 只包含一个 '\0',则将 is_null 设置为 false,将 size 设置为 1,并将 str[0] 设置为 '\0'
在我看来,这可能不是最节省内存的方式(你可能会以某种方式在某个地方保存一个字节),但你在做什么绝对很清楚,而且下一个出现的人会更喜欢这个。