SWF 中所有标记的大小之和 == 标头中指定的 SWF 大小



我正在编写一个SWF解析器,目前我遇到了这个问题。标头规范说 SWF 的大小在标头本身中指定(签名 3 字节、版本 1 字节、大小 4 字节......

但是,如果我遍历每个标签并获取它的大小,我最终得到的几乎是标题中指定的大小,但不是确切的大小。

例:

sig:        FWS
version:    10
length:     3081
screen:     800.0x600.0
fps:        30.0
num frames: 1
4
458
4
3
26
853
1610
66
0
0

num frames后打印的每个数字都是标签的大小。如果我把所有这些加起来,我会得到3024.标头本身是1 + 1 + 1 + 1 + 4 + X + 2 + 2的,在这种情况下是X = 8的(它是一个可变长度的字段)。所以这就是20,添加到所有标签大小的总和的结果中,给了我3044.

剩余3081 - 3044 = 37 bytes字节在哪里?

我做对了,我只是忘了对获得大小所需的字节求和。

例:

|header|tag 24 bytes|tag 37 bytes|tag 7364 bytes|tag 14 bytes|

所以我们有:

SWF(签名,3 个字节)

+

version(1 字节)

+

size(4 字节)

+

rect(假设 9 个字节)

+

frame rate(2 个字节,第一个被忽略,但仍计入总大小)

+

frame count(2 个字节)。

这为标头提供了总共 21 字节。

然后我们开始读取每个标签块。

tag type and length(2 字节)

+

(如果标记长度等于 63,则另外 4 个字节。在本例中,这将仅发生在第三个标记中)

+

(标签的实际大小,在本例中24

在此示例中,我们将有以下内容:

  1. 此标记的大小为 2 + 24

  2. 下一个标签的大小为 2 + 37

  3. 下一个是2 + 4 + 7364.

  4. 最后一个是2 + 14.

所以文件的最终大小是:21(标题)+ 26(标签类型和长度的 2 字节字段的大小 + 实际标签的 24)+ 39(第 2 个标签)+ 7372(第 3 个标签)+ 16(第 4 个标签)= 7474 个。

当您读取包含大小的 4 字节字段时,该数字应与您从标头获得的数字匹配。

相关内容

  • 没有找到相关文章

最新更新