【问题标题】:MS-PST: What is the relationship between nodes, subnodes, and blocks?MS-PST:节点、子节点和区块之间的关系是什么?
【发布时间】:2014-04-06 12:28:03
【问题描述】:

我在理解某些Microsoft PST file format specification 时遇到问题。

我的理解:

在 NDB 层中,我们的条目是 NID。给定一个 NID,我们可以在 BTree 中找到叶子节点。从那里,我们有 bidData 和 bidSub。

bidData 要么指向外部数据节点,要么指向数据树。

bidSub 指向一个子节点树。

我的问题:

  1. 我们可以有一个没有数据树的子节点树吗?
  2. 在什么情况下我们会有子节点树?
  3. 子节点树的结果要和数据树的结果串联吗?

【问题讨论】:

    标签: language-agnostic file-format pst


    【解决方案1】:

    您有 5 个问题。

    1. 节点、子节点、区块之间的关系是什么?
    2. 我们可以有一个没有数据树的子节点树吗?
    3. 在什么情况下我们会有子节点树?
    4. 子节点树的结果要和数据树的结果串联吗?
    5. 我应该先遍历数据块/树,然后是子节点树,还是有其他方法来组织我读取的数据?

    根据here 的标准,问题 1 的答案是

    节点是一种抽象,由字节流和 子节点的集合。它由 NDB 层实现为数据 块(第 2.2.2.8.3.1 节)和子节点 BTree(第 2.2.2.8.3.3 节)。 Node BTree(第 2.2.2.7.7.4 节)中的 NBTENTRY 结构存在 定义哪些块组合形成节点。

    根据图表here,你看到一个节点有你理解的NID、bidData和bidSub。

    摘要是由数据块或数据BTree组成的节点,可以指向数据块和子节点BTree。

    子节点 BTree 包含 SIBLOCK 和 SLBLOCK 结构,其中包含 SIENTRY 和 SLENTRY 结构。

    回答问题 2,是的,您可以拥有一个没有数据 BTree 的子节点 Btree。因为数据树只是指定bidData的一种形式,另一种是指定数据块目录。

    更具体地说,为了根据2.6.1.2.2 创建子节点,您需要有一个数据块才能将 SLENTRY 与其关联。该数据块可以直接指定,也可以是包含一个或多个外部或内部数据块引用的数据树。

    如果您的问题是我们可以有一个子节点 Btree,例如bidSub,如果没有设置相关的bidData,答案是否如上。如果您已按照 here 将 bidData 初始化为 0x0 以表示尚无数据块的占位符节点,则 SLENTRY 不会与占位符节点相关联,直到设置了有效的 bidData。

    回答问题 3,子节点用于将数据划分为逻辑/分层部分。我不知道你的情况,所以除了下面的答案,我真的无法回答这个问题。

    当您需要将数据存储在 PST 中以很好地实现逻辑分离时,您将拥有子节点树。现有使用子节点的示例是按照here 在消息对象中将附件存储在消息传递层中,按照here 在LTP 层中存储表上下文,以及按照here 在属性上下文中进行额外存储。

    回答问题 4,我不明白您所说的结果是什么意思。据我所知,来自数据树和子节点树的信息组合发生在 LTP 或消息传递层。

    回答问题 5,这真的取决于你在做什么? PST SDK提供了一种迭代节点数据库中节点的机制,一种从节点读取流的机制,而不是直接,它还提供了一种方法来迭代第一级子节点,如here和@ 987654329@.

    参考文献(已链接的除外)

    【讨论】:

    • 也许我的一个假设是不正确的。我认为 NDB 层为 LTP 层提供了一个接口,LTP 层可以在其中请求 NodeID,并且 NDB 层返回单个 Stream,它将遍历与该 NodeID 关联的所有数据。
    • 鉴于该假设,问题 4 提出:我应该先遍历数据块/树,然后是子节点树,还是有其他方式来组织我读取的数据
    • 根据您对问题 3 的回答,这让我相信子节点在 NDB 层不相关,NDB 层可能应该为子节点树公开第二个流?
    • 我想我还是不明白为什么有人会使用子节点树?我知道(Unicode)一个数据块的最大数据大小为 8176 字节(8192 减去 BLOCKTRAILER),一个 XBLOCK 可以引用 1021 个数据块,产生 7.96 MB,一个 XXBLOCK 可以引用 1021 个 XBLOCK,产生 7.93 GB。当我需要存储大于 7.93 GB 的数据时,是否使用子节点树?或者,它是用于特定情况,例如消息存储在数据树中,附件存储在子节点树中,还是其他特定情况?
    • 后者。根据我给出的答案和示例,子节点树用于数据的概念/逻辑分离。人们通常不会直接在 NDB 级别创建对象,而是在 LTP 和 PST 级别创建对象,根据here,这些对象在节点上使用堆,在节点上使用堆上的 BTree
    猜你喜欢
    • 2019-07-10
    • 1970-01-01
    • 2023-03-04
    • 2018-09-13
    • 2017-03-05
    • 2021-11-29
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多