【问题标题】:Are null terminators good for parsing binary files空终止符是否适合解析二进制文件
【发布时间】:2017-01-02 14:36:25
【问题描述】:

我正在尝试开发一个保存游戏系统,但我一直在努力找出使用 c-strings 的最佳方法。我知道我可以使用 int 来标记字符数,但我想知道使用空终止符是否是个好主意。 (特别是因为目前我在尝试在加载端找到空终止符时遇到问题)

TL;DR 问题:是否在二进制文件中使用空终止符是字符串的最佳实践,如果没有,您有什么建议。

另外,如果你能告诉我如何在我的内存缓冲区(一个 C 字符串)的中间找到一个空终止符,那就太好了,但我知道从技术上讲这是一个不同的问题。

【问题讨论】:

  • 它并不比任何其他选项好或差。
  • 你如何区分字符串末尾的 nul-byte(例如0)与其他 nul-byte你的二进制文件? (就像short a = 10; 中的那个)?

标签: c file null binary


【解决方案1】:

我推荐使用 SQLite 作为文件格式。更容易处理。

你可以在上面插入blob。

考虑何时需要更新文件格式。使用 SQLite 是小菜一碟。只需向表中添加一个新列或使用 UPDATE...

检查:https://www.sqlite.org/appfileformat.html

【讨论】:

  • SQLlite 在速度和大小上是否与 C 二进制文件相当(我什至没有使用 fstream,因为我知道它们对 CPU 更苛刻)。另外,我最终不需要为网络序列化数据吗?我从来没有做过网络,但我认为这是两鸟一石。
  • 处理比单纯读取文件要多,但一般使用的好处是很大的。你检查页面了吗?对于 C 中的二进制序列化检查 binn
【解决方案2】:

在二进制文件中使用 NULL 终止符来标记字符串结尾的问题是二进制文件可能包含 NULL 字符。如果你知道你永远不会在文件中存储 NULL 字符,除了标记字符串的结尾,你会没事的。

如果文件中可能包含 NULL 字符,那么您可以预定义字符串的长度,但是您需要事先知道要存储的字符串的最大长度。例如,您可以说每个字符串必须占用 128 个字符,并且未使用的字符用 NULL 填充。

如果这些解决方案在这种情况下都不起作用,您总是可以在每个字符串前面加上它的长度。

【讨论】:

    【解决方案3】:

    您应该能够为您的二进制文件提供规范。在您的情况下,如果您确实希望将空终止符计为数据,则需要弄清楚如何转义它。检查每个角色是否值得痛苦?通过具有预定义的长度或从文件中读取的长度,可以更轻松地完成您提到的操作。如果您正在读取的字段实际上是一个带有空终止符的字符串数组,也许您应该指定总数组的长度,并在将字符串读入变量后处理split。

    【讨论】:

    • 谢谢!我的计划类似于 JSON,但更简单。即:npc_houndeye{name:bob,hp:45}。我只需要找出最快、最小的方法来编写它,但我知道我需要字段名称来实现版本之间的向后兼容性。我不想要整数的原因是它会a)占用空间和B)令人困惑。不过可能会更快。
    • 不需要优化,除非你看到加载/保存太慢
    • @LưuVĩnhPhúc 我正在优化,因为我正在处理几十个不同的系统,所有这些系统都占用内存和速度。最好在每个隔间尽可能多地处理头顶问题,而不是在稍后速度缓慢时吓坏。
    • 解析 JSON 这么慢? “过早的优化是万恶之源”。游戏保存/加载仅在游戏过程中的某个时刻发生,并且通常在用户暂停游戏时发生,因此他们不会注意到文件加载速度快了四分之一秒。更重要的是游戏场景的加载,往往需要更长的时间,会刺激玩家
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2019-10-11
    • 2014-09-19
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2013-08-22
    • 2012-01-11
    相关资源
    最近更新 更多