SWF 中所有标签的大小总和 == header 中指定的 SWF 大小?
Sum of the size of all tags in SWF == SWF size specified in header?
我正在编写一个 SWF 解析器,但我目前遇到了这个问题。 The header spec 表示 SWF 的大小在 header 本身中指定(签名 3 字节,版本 1 字节,大小 4 字节...)
但是,如果我遍历每个标签并获取它的大小,我最终得到的大小几乎与 header 中指定的大小相同,但不是那个确切的大小。
示例:
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
。 header 本身是 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 个字节)。
这为 header.
提供了总共 21
个字节
然后我们开始读取每个标签块。
tag type and length
(2 个字节)
+
(如果标签长度等于 63,则另外 4 个字节。在本例中,这只会发生在第 3 个标签中)
+
(标签的实际大小,在本例中为 24
)
在这个例子中,我们有这个:
这个标签的大小是2 + 24
下一个标签的大小是2 + 37
。
下一个是2 + 4 + 7364
.
最后一个是2 + 14
.
所以文件的最终大小是:21
(header) + 26
(标签类型和长度的 2 字节字段的大小 + 实际标签的 24 ) + 39
(第二个标签)+ 7372
(第三个标签)+ 16
(第四个标签)= 7474
.
当您读取包含大小的 4 字节字段时,该数字应与您从 header 中获得的数字相匹配。
我正在编写一个 SWF 解析器,但我目前遇到了这个问题。 The header spec 表示 SWF 的大小在 header 本身中指定(签名 3 字节,版本 1 字节,大小 4 字节...)
但是,如果我遍历每个标签并获取它的大小,我最终得到的大小几乎与 header 中指定的大小相同,但不是那个确切的大小。
示例:
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
。 header 本身是 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 个字节)。
这为 header.
提供了总共21
个字节
然后我们开始读取每个标签块。
tag type and length
(2 个字节)
+
(如果标签长度等于 63,则另外 4 个字节。在本例中,这只会发生在第 3 个标签中)
+
(标签的实际大小,在本例中为 24
)
在这个例子中,我们有这个:
这个标签的大小是
2 + 24
下一个标签的大小是
2 + 37
。下一个是
2 + 4 + 7364
.最后一个是
2 + 14
.
所以文件的最终大小是:21
(header) + 26
(标签类型和长度的 2 字节字段的大小 + 实际标签的 24 ) + 39
(第二个标签)+ 7372
(第三个标签)+ 16
(第四个标签)= 7474
.
当您读取包含大小的 4 字节字段时,该数字应与您从 header 中获得的数字相匹配。