3

我试图了解 Visual FoxPro 紧凑索引 (*.IDX) 的文件格式。我目前正在参考Microsoft 的文档以获取指导。

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

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

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

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

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

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

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

4

4 回答 4

4

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

variable_key_length = fixed_key_length - duplicate_byte_count - trailing_byte_count

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

于 2009-01-02T13:23:42.737 回答
1

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

于 2009-10-22T06:00:16.397 回答
1

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

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

于 2011-06-17T21:20:16.553 回答
0

微软说这是关于 IDX 文件结构的(在页面底部有指向所有其他文件的链接,如紧凑索引格式。)

于 2009-01-01T03:50:40.237 回答