gpt4 book ai didi

c - 在 C 中序列化字符串

转载 作者:行者123 更新时间:2023-12-01 12:29:15 25 4
gpt4 key购买 nike

我正在将结构序列化为字节流。我的方法很简单:以小端顺序打包所有整数并复制包括空终止符在内的字符串。另一方必须静态地知道如何解压字节流,没有额外的元数据。

我的问题是,我不知道如何处理 NULL 指针?

我需要发送一些东西,因为流中没有额外的元数据。

我考虑了以下两个选项:

  1. 发送一个'\0'并让接收方在任何情况下都将其解释为NULL

  2. 发送一个'\0'并让接收方在任何情况下都将其解释为'\0'(分配一个字节)

  3. 发送一个特殊字符表示 char* str == NULL,例如ETX、EOT、EM?

你怎么看?

最佳答案

看起来您目前正试图通过向接收端传递一个特殊字符来告诉接收端已到达序列化字符串的末尾。有一百万个案例可以让你搞砸:

如果您的结构包含一个等于该特殊字符的字节怎么办。用另一个特殊字符转义它。如果您的结构包含一个字节序列,该字节序列等于您的转义字符后跟您的特殊字符,也要检查它吗?

是的,这是可行的,但我认为这不是一个很好的解决方案,你必须编写一个解析器来寻找转义字符,然后任何稍后查看代码的人都会花两个小时试图弄清楚发生了什么事。

(tl;dr) 相反... 只需使序列化字符串的前 32 位等于字符串中的字节数。这每次序列化仅花费 4 个字节,解决了您所有的问题,您不必编写解析器或担心特殊字符,并且会让下一个阅读您的代码的人更容易!

编辑

感谢 JeremyP,我才意识到我并没有真正回答你的问题。为每个字符串发送这些人之一:

结构 s_str{ bool 是_null; 整数大小; 字符 * 海峡;};

如果它为空,只需将 is_null 设置为 true,您真的不必担心其他两个。如果它的大小为零,则将 is_null 设置为 false 并将大小设置为零。如果 str 仅包含一个 '\0',则将 is_null 设置为 false,将 size 设置为 1,将 str[0] 设置为 '\0'

在我看来,这可能不是最有效的内存方式(你可能会以某种方式在某处保存一个字节)但你在做什么绝对非常清楚,下一个出现的人也会喜欢这个更多。

关于c - 在 C 中序列化字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10026783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com