跑回来中
生成一个swf文件,数据结构(1)
2006-08-24 19:32:28 / 天气: 晴朗
/ 心情: 高兴
/ 个人分类:ActionScript 杂
起因是看见论坛中有人询问是否可以用swf,asp,php这样的东西生成一个swf。而不是使用flash,或者其他的什么编译器。(虽然我们彼此很不友好。当然,责任在我,是因为我的胡说八道开始的,所以如果哪位先生接受的话,这篇和接下来的几篇文章可以拿来作道歉用)
一开始我必须了解基础的知识才能去分析添加文字,图片或者actionscript代码。
这是一个困难的任务,因为我必须知道swf是什么样子的。而在之前,编译器替我隐藏了这一层的知识。swf的文件结构是头部,和若干的数据块组成的。这有点像html,想象头部是<head>数据块是<table>。头部描述了文件格式,版本号,文件大小,显示的尺寸,贞频和贞的总数量。
| 项目 |
类型 |
描述 |
| 文件类型说明 |
8位 |
文件类型的说明,F或者C,F表示文件没有被压缩,C表示采用zlib压缩文件 |
| 文件类型说明 |
8位 |
W |
| 文件类型说明 |
8位 |
S |
| 文件的版本号 |
8位 |
文件的版本号,比如version8,这一项就是0x08 |
| 文件的长度 |
32位 |
文件的长度,如果被压缩,则这个数字表示的是解压缩之后的文件长度 |
| 显示的尺寸 |
rect |
这是一个特殊的类型。使用twips作为单位,1 twips = 1/1440英寸 |
| 贞频 |
16位 |
8.8的定点数(低八整数,高八小数)表示每一秒更新的贞数 |
| 贞数量 |
16位 |
影片一共有多少贞。注意右边是高位。例如0102表示有513贞,而不是258贞 |
但愿我的图片上传成功了~,那样可以参考一下。图片表示的是一个只有两个空白关键贞的swf文件。

了解了文件头,我最困惑的地方是rect。这是一个什么东西?
这是一个swf中的数据结构,这个结构中储存了,在许多不同坐标系中某一个单元的位置信息,在我上传的图片的这个例子里,是_root。在头部信息的这个rect中,一定有Xmin=0,Ymin=0,而Xmax,Ymax表示的是场景的宽高。这样说了,我还是不明白
那么,让我来看一看swf中基本的数据结构吧:
1,swf的长度单位,swf使用twips表示坐标中的距离,1 twips=1/20 pixel。(我现在知道拉!flash的反走样是使用超采样地~~)这样分数的pixel可以使用整数的twips表示。样式书还说明了其他的好处,不过这和我有什么关系?
2,整型和字节顺序
swf使用8位,16位,32位,64位,有符号和无符号整形类型。所有的整形都是用little-endian的字节顺序(即数值低位储存在字节高位)。然后在每一个字节中采用big-endian编序。这样你就不会误会,字节80表示的确实是 128,而不是1 例子:16位的0xe712 被保存成 12 e7.32位的0x456e7120 被保存成20 71 6e 45.
3,定点数
swf中有两种定点数16位(8.8)和32位(16.16)。使用little-endian字节顺序
4,浮点数
有16位(半精度half),32位(单精度float),64位两种(双精度double)。
5,变长数(bit value)
长度可变的数,变长数可以表示无符号,有符号,和16.16定点数。
变长数不须要byte对齐(其他类型须要),如果需要byte对齐的类型紧接着变长数出现,需要补零。bit value作为不同的类型(前面说的3中)在解释上使用补0补1的方法。比如SB[4](有符号4位变长数) = 1110解释成16位有符号整形为 1111111111111110 = –2。有关bit value的详细内容,请务必查阅样式书。

如图所示,变长数需要补0。
变长数的一个应用就是rect(终于来到这里拉)。
Rect结构的定义:
| Field |
Type |
Comment |
| Nbits |
UB[5] |
定义Xmin这样的每一项要使用多少位 |
| Xmin |
SB[Nbits] |
矩形的最小x值 |
| Xmax |
SB[Nbits] |
矩形的最大x值 |
| Ymin |
SB[Nbits] |
矩形的最小y值 |
| Ymax |
SB[Nbits] |
矩形的最大y值 |
Nbits用来决定使用多少位来储存Xmin,Xmax...的每一项,比如有一个矩形(decimal表示十进制,binary表示二进制)
Xmin = 127 decimal = 1111111 binary
Xmax = 260 decimal = 100000100 binary
Ymin = 15 decimal = 1111 binary
Ymax = 514 decimal = 1000000010 binary
Nbits 要按照需要最多位的一项来算, 这里 Ymax 是514 (二进制01000000010)最多,需要11位来表示.于是Rect就要被储存成:
| Nbits |
UB[5] |
1011 Bits required (11) |
| Xmin |
SB[11] |
00001111111 x minimum in twips (127) |
| Xmax |
SB[11] |
00100000100 x maximum in twips (260) |
| Ymin |
SB[11] |
00000001111 y minimum in twips (15) |
| Ymax |
SB[11] |
01000000010 y maximum in twips (514) |
好了,我已经可以看懂头部了。
=======================================================================================================================
=================================================8月26日 礼拜六 修正====================================================
上面的文字对类型的简记符没有说明,现在添加如下:
UIx x位无符号整型;(如UI8表示8位无符号整型,即一个byte的无符号整型)
SIx x位有符号整型;
UIx[n] x位无符号整型的长度是n的数组;
SIx[n] x位有符号整型的长度是n的数组;
FIXED 32位 16.16定点数
FIXED8 16位 8.8定点数
FLOAT16 16位半精度浮点数
FLOAT 32位单精度浮点数
DOUBLE 64位双精度浮点数
UB[n] n位变长数表示无符号整型
SB[n] n位变长数表示有符号整型
FB[n] n位变长数表示定点数
在下一篇中将采用这些记法来表示数据。
引用链接
推荐
收藏
导入论坛
等级(0)
编辑
管理
查看(335)
评论(2)
评分(0/5)
TAG:
猫のスナ箱