标题中指定的SWF == SWF大小中所有标记大小的总和?

时间:2015-01-26 11:57:07

标签: actionscript-3 flash magic-numbers

我正在编写一个SWF解析器,而我目前正在解决这个问题。 The header spec表示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剩余字节在哪里?

1 个答案:

答案 0 :(得分:0)

我做得对,我只是忘了总结获得大小所需的字节数。

示例:

|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个字节。这只发生在本例中的第3个标签中)

+

(标签的实际尺寸,在这种情况下为24

在这个例子中,我们有这个:

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

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

  3. 下一个是2 + 4 + 7364

  4. 最后一个是2 + 14

  5. 因此文件的最终大小为:21(标题)+ 26(标记的类型和长度的2字节字段的大小+实际标记的24的大小)+ {{1} }(第二个标签)+ 39(第三个标签)+ 7372(第四个标签)= 16

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