【问题标题】:Visual FoxPro Compact Index File FormatVisual FoxPro 紧凑索引文件格式
【发布时间】:2008-12-31 20:54:30
【问题描述】:

我正在尝试了解 Visual FoxPro 紧凑索引 (*.IDX) 的文件格式。我目前正在参考Microsoft's documentation 寻求指导。

索引是一个 512 字节节点的 B 树。每个叶(“外部”)节点包含多个条目。每个条目由四个数据组成:

  • 行号 [固定长度]
  • 重复的字节数(文档没有解释这一点)[固定长度]
  • 尾随字节数(文档未对此进行解释)[固定长度]
  • 键 [可变长度]

条目(没有它们的键)存储在节点的开头,紧跟在节点的 24 字节标头之后。它们的键不包含在此位置,因为键的长度不同,而行号、重复字节数和尾随字节数的长度是固定的。密钥存储在节点的末尾并向后工作。例如:

  • 24 字节头
  • 行号、重复字节数、尾随字节数(条目 #1)
  • 行号、重复字节数、尾随字节数(条目 #2)
  • 行号、重复字节数、尾随字节数(条目 #3)
  • ...
  • 键(条目 #3)
  • 键(条目 #2)
  • 键(条目 #1)

如何确定键的各个长度?该文档似乎没有指定这一点。它们是完全连续的(没有空字节分隔符)。

我可以通过目测手动隔离按键。我怀疑尾随字节数代表密钥的长度。但是,它与本次检查确定的长度无关。

我相信 FoxPro 文件格式源自 xBase 标准。也许这敲响了警钟?

【问题讨论】:

    标签: indexing file-format visual-foxpro foxpro xbase


    【解决方案1】:

    在发现 XBase::Index Perl 模块后,我确定外部节点中的键的长度实际上与内部节点中的固定长度键的长度相同,只是删除了任何尾随空格。这就是文档中提到的“尾随字节数”所指的内容(从键的末尾截断了多少尾随空格)。我还没有确定“重复字节数”是什么,但模块至少澄清了它的关系:

    variable_key_length = fixed_key_length - duplicate_byte_count - trailing_byte_count
    

    例如,假设此索引的固定键长度为 10 个字节。现在假设密钥“DOG”存储在外部节点中。它的重复字节数(根据我观察到的)很可能为零,而它的尾随字节数将是 7(截断的空格数)。因此,只会存储代表“DOG”的三个字节。

    【讨论】:

      【解决方案2】:

      关于重复字节数:这意味着第一个字节的数量,在当前键和前一个键中相同。存储在节点末尾的第一个键条目具有完整长度,除了尾随空格;连续的键输入只有与前一个键输入不同的符号。

      【讨论】:

      • 太棒了!谢谢你的提示! :) 你是怎么发现的?
      【解决方案3】:

      在 Xbase 中,使用索引(索引讨论文本)时,索引很少超过 10 个字符或 15 个(很少)。

      无论如何,如果您知道键的数量按比例划分二进制部分。 当您制作存储数据的算法或使用以下方式存储数据时:开始或结束标记或制表符,或者您是否保留静态大小以便不使用留空。静态格式效率较低,但读取速度更快,而且显然会生成更可预测的结构。

      【讨论】:

        【解决方案4】:

        Microsoft says 这是关于 IDX 文件结构的(在页面底部有指向所有其他文件的链接,例如 Compact Index format。)

        【讨论】:

        • 感谢您的链接。但是,您链接的紧凑索引格式似乎与我链接的结构完全相同(您的指的是 FoxPro 8.0,我的指的是 FoxPro 9.0 SP2,在这方面两者都是相同的)。
        猜你喜欢
        • 1970-01-01
        • 2014-02-19
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 2012-08-26
        相关资源
        最近更新 更多