Ynv*_*Ynv 2 c string null serialization deserialization
我正在将结构序列化为字节流。我的方法很简单:以小端顺序打包所有整数并复制包括空终止符的字符串。另一方必须静态地知道如何解包字节流,没有额外的元数据。
我的问题是,我不知道如何处理NULL指针?
我需要发送一些东西,因为流中没有额外的元数据。
我考虑了以下两个选择:
发送一个 '\0' 并使接收方在任何情况下都将其解释为 NULL
发送'\0'并让接收方在任何情况下都将其解释为'\0'(分配一个字节)
发送表示 char* str == NULL 的特殊字符,例如 ETX、EOT、EM ?
你怎么认为?
看起来您当前正在尝试通过向接收端传递特殊字符来告诉接收端已到达序列化字符串的末尾。有上百万个案例可以让你陷入困境:
如果您的结构包含一个等于该特殊字符的字节怎么办?用另一个特殊字符逃脱它。如果您的结构包含一个等于转义字符后跟特殊字符的字节序列,请检查一下怎么办?
是的,这是可行的,但我认为这不是一个很好的解决方案,您必须编写一个解析器来查找转义字符,然后任何稍后查看代码的人都会花两个小时试图弄清楚发生了什么。
(tl;dr) 相反...只需使序列化字符串的前 32 位等于字符串中的字节数即可。每次序列化仅花费 4 个字节,解决了您的所有问题,您不必编写解析器或担心特殊字符,并且将使下一个阅读您的代码的人变得更加容易!
编辑
感谢 JeremyP,我刚刚意识到我并没有真正回答你的问题。为每个字符串发送一个这样的人:
struct s_str { 布尔 is_null; 整数大小;字符* 字符串;};
如果它为 null,只需将 is_null 设置为 true,您实际上不必担心其他两个。如果其大小为零,则将 is_null 设置为 false,并将 size 设置为零。如果 str 仅包含 '\0',则将 is_null 设置为 false,将 size 设置为 1,并将 str[0] 设置为 '\0'
在我看来,这可能不是最有效的内存方式(你可能可以在某个地方节省一个字节),但你在做什么绝对很清楚,而且下一个出现的人会更喜欢这个。
| 归档时间: |
|
| 查看次数: |
2456 次 |
| 最近记录: |