跑回来中

生成一个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位变长数表示定点数

在下一篇中将采用这些记法来表示数据。


TAG: 猫のスナ箱

may-weather的个人空间 删除 liuqinglong 发布于2007-12-02 02:57:04
我向晚的?你说呢?时不时/哈哈黄河
may-weather的个人空间 删除 gembin@gmail 发布于2007-02-01 21:01:50 评-5分
有没详细的介绍,flash的数据结构如何,这个网上千篇一律,都这样,还是肤浅,有没有深入点的
我来说两句

-5 -3 -1 - +1 +3 +5

Open Toolbar