swf文件结构中的大体数据类型.docx
《swf文件结构中的大体数据类型.docx》由会员分享,可在线阅读,更多相关《swf文件结构中的大体数据类型.docx(22页珍藏版)》请在冰豆网上搜索。
swf文件结构中的大体数据类型
CHAPTER4
BasicDataTypes
ThissectiondescribesthebasicdatatypesthatmakeupthemorecomplexdatastructuresintheMacromediaFlash(SWF)fileformat.AllotherstructuresintheSWFfileformatarebuiltonthesefundamentaltypes.
这章节描述大体数据类型—在SWF文件里能够创建更多复杂数据结构。
所有在SWF文件里的其它结构都是由这些大体类型创建的。
Coordinatesandtwips坐标和缇
TheSWFfileformatstoresallx-ycoordinatesasintegers,usuallyinaunitofmeasurementcalledatwip.IntheSWFformat,atwipis1/20thofalogicalpixel.Alogicalpixelisthesameasascreenpixelwhenthefileisplayedat100%—thatis,withoutscaling.
Forexample,arectangle800twipswideby400twipshighisrenderedas40by20logicalpixels.Fractionalpixelsizesareapproximatedwithanti-aliasing.Arectangle790by390twipsbypixels)appearstohaveslightlyblurrededges.
Twipsareagoodcompromisebetweensizeandprecision.Theyprovidesub-pixelaccuracyforzoomingandpreciseplacementofobjects,whileconsumingveryfewbitsperintheSWFfileformatusethetraditionalgraphicsaxes:
xishorizontalandproceedsfromminimumvaluesatthelefttomaximumvaluesattheright,andyisverticalandproceedsfromminimumvaluesatthetoptomaximumvaluesatthebottom.
swf文件格式用整数来存储X-Y坐标,它的单位默许的是缇(twip),20twip=1pixel。
在没有缩放的情形下,确实是100%播放时,swf中的一个逻辑像素和屏幕上的一个像素是对应的。
利用缇的益处确实是能够取得比利用像素更高的精度。
比如,一个800twips宽,400twips高的矩形,就会被说明成40×20像素的大小,这时矩形的边缘是没有锯齿的。
若是是790×390twips(×像素)的话,它的就会有轻微的模糊边缘。
Twips一个大小与精度之间好的折衷方案。
当处置少数坐标位时,它们规定支持了缩放的亚像素的精准度(sub-pixel)和对象放置的精度。
在swf的坐标系里面,它采纳的是传统的图像的坐标,x轴是水平方向,而且是从左到右值是增大的;y轴是垂直方向的,而且从下到上是增加的。
Integertypesandbyteorder整数类型和字节顺序
TheSWFfileformatuses8-bit,16-bit,32-bit,64-bit,signed,andunsignedintegertypes.AllintegervaluesarestoredintheSWFfilebyusinglittle-endianbyteorder:
theleastsignificantbyteisstoredfirst,andthemostsignificantbyteisstoredlast,inthesamewayastheIntelx86architecture.ThebitorderwithinbytesintheSWFfileformatisbig-endian:
themostsignificantbitisstoredfirst,andtheleastsignificantbitisstoredlast.
swf文件中利用的8位、16位、32位、64位有符号和无符号的整数。
这些整数在swf文件中是以little-endian的顺序来存储的:
低字节在前,高字节在后,一样方式应用于IntelX86体系结构。
而每一个字节的每一名那么是按big-endian的顺序来排列的:
即高位在先,低位在后。
Forexample:
The32-bitvalue0x456e7120isstoredas20716e45.
The16-bitvalue0xe712isstoredas12e7.
Allintegertypesmustbebytealigned.Thatis,thefirstbitofanintegervaluemustbestoredinthefirstbitofabyteintheSWFfile.
比如一个32位的整数:
0x456e7120,它在文件中确实是以20716e45的格式存储的。
一个16位的整数:
0xe712,它在文件中确实是以12e7的格式存储的。
这种方式就称为little-endian。
在SWF文件中,所有整数类型必需是字节对齐的。
也确实是,一个整数值的第一名必需存储在一个字节的第一名。
little-endian要紧用在咱们此刻的PC的CPU中,big-endian那么应用在目前的Mac机械中(是指Power系列处置器)。
Signedintegersarerepresentedbyusingtraditional2’s-complementbitpatterns.Thesearethesignedintegerrepresentationsusedonmostmoderncomputerplatforms.Inthe2’scomplementsystem,negativenumbershave1asthefirstbit,andzeroandpositivenumbershave0asthefirstbit.Anegativenumber,-n,isrepresentedasthebitwiseoppositeofthepositive-zeronumbern-1.
符号整数通过利用2补数位形式(2’s-complementbitpatterns)来描述的。
这种符号整数表示法用于大多数现代微机平台。
在2’scomplement系统里,负数第一名设为1,而且0和正数第一名设为0.一个负数,-n,描述成那个数的正数n-1的反数(取反)。
IntegerTypes
TypeComment
SI8Signed8-bitintegervalue带符号8位整数
SI16Signed16-bitintegervalue带符号16位整数
SI32Signed32-bitintegervalue带符号32位整数
SI8[n]Signed8-bitarray—nisthenumberofarrayelements带符号8位数组,n是数组元素个数
SI16[n]Signed16-bitarray—nistheisnumberofarrayelements带符号16位数组,n是数组元素个数
UI8Unsigned8-bitintegervalue不带符号8位整数
UI16Unsigned16-bitintegervalue不带符号16位整数
UI32Unsigned32-bitintegervalue不带符号32位整数
UI8[n]Unsigned8-bitarray—nisthenumberofarrayelements不带符号8位数组,n是数组元素个数
UI16[n]Unsigned16-bitarray—nisthenumberofarrayelements不带符号16位数组,n是数组元素个数
UI24[n]Unsigned24-bitarray—nisthenumberofarrayelements不带符号24位数组,n是数组元素个数
UI32[n]Unsigned32-bitarray—nisthenumberofarrayelements不带符号32位数组,n是数组元素个数
UI64[n]Unsigned64-bitarray—nisthenumberofarrayelements不带符号64位数组,n是数组元素个数
Fixed-pointnumbers
TheSWFfileformatsupportstwotypesoffixed-pointnumbers:
32bitand1632-bitfixed-pointnumbersare.Thatis,thehigh16bitsrepresentthenumberbeforethedecimalpoint,andthelow16bitsrepresentthenumberafterthedecimalpoint.
swf文件格式支持两种类型的定点数:
32位定点数和16位定点数。
32位定点数的格式是格式的,小数点前面和小数点后面的每一部份各占2个字节(16位)。
FIXEDvaluesarestoredlike32-bitintegersintheSWFfile(usinglittle-endianbyteorder)andmustbebytealigned.
而且在SWF文件里,也是采纳了little-endian的形式—定点数像32位整数一样存储,必需字节对齐。
Forexample:
Therealvalueisequivalentto:
。
ThisvalueisstoredintheSWFfileas:
00800700SWF8andlatersupports16-bitsigned,fixed-pointnumbers.Thehigh8bitsrepresentthenumberbeforethedecimalpoint,andthelow8bitsrepresentthenumberafterthedecimalpoint.FIXED8valuesarestoredlike16-bitintegersintheSWFfile(usinglittle-endianbyteorder)andmustbebytealigned.
比如一个32位的实数:
=。
在文件中确实是以00800700的形式存储的。
16位的定点数和32位的是类似的,采纳格式,也是little-endian的形式。
16位的定点数是在Flash8及其以后版本中才被支持的。
在SWF文件里FIXED8数据存储时就像16位整数一样利用little-endian字节序,而且必需字节对齐。
Fixed-PointTypes
TypeComment
FIXED32-bitfixed-pointnumber32位定点数
FIXED816-bitfixed-pointnumber16位定点数
Floating-pointnumbers
SWF8andlatersupportstheuseofIEEEStandard754compatiblefloating-pointtypes.
Threetypesoffloating-pointnumbersaresupported.
Floating-PointTypes
TypeComment
FLOAT16Half-precision(16-bit)floating-pointnumber
FLOATSingle-precision(32-bit)IEEEStandard754compatible
DOUBLEDouble-precision(64-bit)IEEEStandard754compatible
FLOAT16isidenticaltothecharacteristicsofFLOATexceptforchangestothenumberofbitsallocatedtotheexponentandmantissa:
■1bitforthesign1位作为符号位
■5bitsfortheexponent,withanexponentbiasof165位是分派给指数部份,实际的
指数是5位数表示的数和16的差值;
■10bitsforthemantissa10位用来表示尾数
swf8及其后续的版本中支持和IEEEStandard754兼容的浮点数类型。
一共有三种类型,别离是:
Half-precision(16-bit)floating-pointnumber半精度、Single-precision(32-bit)单精度、Double-precision(64-bit)双精度。
除半精度的这种浮点型数据之外,其它两种都符合IEEEStandard754的标准。
半精度的也是和IEEEStandard754类似的,只是改变了标准中分派给尾数和指数的位数。
在半精度型的浮点数中,一名作为符号位;5位是分派给指数部份,实际的指数是5位数表示的数和16的差值;剩余的10位用来表示尾数。
Bitvalues
Bitvaluesarevariable-lengthbitfieldsthatcanrepresentthreetypesofnumbers:
1.Unsignedintegers2.Signedintegers3.Signedfixed-pointvalues.
位值是用多少位来表示一个数值是不确信的,也确实是说,表示值的时候,位数是可变的。
它能够表示三种类型的数值:
无符号整数、有符号整数和有符号的格式的定点数。
位值不是位齐的,而其它一些数据类型,比如前面提到过的无符号整数等都是必需位齐的。
若是一个位齐的数据类型后面随着一个位值,那么最后几位若是不能填满的话,应该用0补齐。
而且以上这些数若是需要扩展的话,是按符号扩展来进行扩展的。
Bitvalues位值.
一个字节由8位组成,为了节约存储空间,swf文件中很多的flag都利用位作为记录空间,比如UB[n],确实是由n位组成的一个unsignedintegerorlong数据,在利用bitvalues时,若是一个结构(Recordstruct)已经描述完成,但bit位指针不是8的倍数,需要利用到fillbits(0)将数据补足为8的倍数,进行字节对齐的操作.
Bitvaluesarevariable-lengthbitfieldsthatcanrepresentthreetypesofnumbers:
integers
integers
fixed-pointvalues.
Bitvaluesdonothavetobebytealigned.Othertypes(suchasUI8andUI16)arealwaysbytealigned.Ifabyte-alignedtypefollowsabitvalue,thelastbytethatcontainsthebitvalueispaddedwithzeros.
位值是一个变长位域,能描述三种数值:
一、不带符号整数;二、符号整数;3、带符号定点数
Bit值不用字节对齐。
其它类型(诸如UI8和UI16)常常字节对齐。
若是一个字节对齐类型跟从一个位值,那最后一个字节—包括位值,必需用0填充。
Thefollowingexampleisastreamof64bits,madeupof9-bitvaluesofvaryinglength,followedbyaUI16value:
下面那个例子是一个64位的数据流,由9个变长的位值组成,后面紧跟一个UI16值:
Thebitstreambeginswitha6-bitvalue(BV1),followedbya5-bitvalue(BV2)thatisspreadacrossByte1andByte2.BV3isspreadacrossByte2andByte3,whileBV4iswhollycontainedwithinByte3.Byte5containstwobitvalues:
BV7andBV8.BV9isfollowedbyabyte-alignedtype(UI16),sothelastfourbitsofByte6arepaddedwithzeros.
那个位数据流从一个6位值开始,紧接着5位值,那个值跨度Byte1和Byte2两个字节之间。
BV3跨度在Byte2和Byte3两个字节之间。
而BV4整个包括在Byte3中。
Byte5包括两个位值:
BV7和BV8。
BV9后面紧接一个字节对齐的UI16。
因此,第六个字节的最后四位要被0填充补齐。
BitValues
TypeComment
SB[nBits]Signed-bitvalue(nBitsisthenumberofbitsusedtostorethevalue)
UB[nBits]Unsigned-bitvalue(nBitsisthenumberofbitsusedtostorethevalue)
FB[nBits]Signed,fixed-pointbitvalue(nBitsisthenumberofbitsusedtostorethevalue)
SB[nBits]带符号的位值(nBits表示那个值有nBits位被存储)
UB[nBits]无符号位值(nBits表示那个值有nBits位被存储)
FB[nBits]带符号,定点小数位值(nBits表示那个值有nBits位被存储)
Whenanunsigned-bitvalueisexpandedintoalargerwordsize,theleftmostbitsarefilledwithzeros.Whenasigned-bitvalueisexpandedintoalargerwordsize,thehighbitiscopiedtotheleftmostbits.
当一个无符号的位值被扩展到一个largerword大小,最左侧的位所有被0填充。
当一个带符号的位值被扩展到一个largerword大小,最高位被复制到最左侧的所有位。
Thisexpansioniscalledsignextension.Forexample,the4-bitunsignedvalueUB[4]=1110wouldbeexpandedtoa16-bitvaluelikethis:
0000000000001110=14.Thesamevalueinterpretedasasignedvalue,SB[4]=1110wouldbeexpandedto110=–2.Signed-bitvaluesaresimilarbutmusttakeaccountofthesignbit.Thesignedvalueof35isrepresentedasSB[7]=0100011.Theextrazerobitisrequired;otherwisethehighbitissignextendedandthevalueisinterpretedasnegative.
这种扩展被称为符号扩展。
例如:
一个4-bit无符号值UB[4]=1110,将被扩展成一个16-bit的值,像如此:
0000000000001110=14。
一样的值被说明成一个带符号的值,SB[4]=1110将被扩展成
110=-2。
符号位的值是相似的,但必需与符号位相同。
带符号的值35被描述成SB[7]=0100011。
扩展位0是必需的;不然,最高位被扩展置位,那个值就被描述成负数了。
Fixed-pointbitvaluesare32-bitsigned,fixed-pointnumbers.Thatis,thehigh16bitsrepresentthenumberbeforethedecimalpoint,andthelow16bitsrepresentthenumberafterthedecimalpoint.Afixed-pointbitvalueisidenticaltoasigned-bitvalue,buttheinterpretationisdifferent.Forexample,a19-bit,signed-bitvalueof0x30000isinterpretedas196608decimal.The19-bit,fixed-pointbitvalue0x30000isinterpretedas.Theformatofthisvalueiseffectivelyratherthan.
定