nodejs解析swf文件头直接拿到swf文件的rect数据,从而得到真实的宽高; 1. [代码] [JavaScript]代码 用nodejs 的fs模块读出文件; var fs = require('fs');undefined var swf = fs.readFileSync('bug0150.swf’); swf
1. [代码][JavaScript]代码
用nodejs 的fs模块读出文件; > var fs = require('fs'); undefined > var swf = fs.readFileSync('bug0150.swf’); > swf <Buffer 43 57 53 0f 76 4b 00 00 78 9c d5 ba 05 54 1e 4d b3 2e 3a b8 13 dc 09 4e 70 77 77 77 77 77 77 49 82 07 87 17 d7 00 c1 dd 22 38 04 77 08 01 82 04 0b 4e ... > 好吧 ,文件头的说明我在上边做了标注,下边是开始逐个解析 首先: 前面 4 字节 数据 含义 43 “C”,表示压缩的 46 表示没有压缩 57 “W” 53 “S” 0f SWF文件版本为15 从8位往后就是rect数据,就是swf宽高数据了; 然后用的zlib解压得到 解压后的 78 00 05 dc 00 00 0b b8 00 00 18 01 00 44 11 10 00 00 00 zlib解压的方法是require(‘zlib’).inflateSync(swf.slice(8,100));解前面一百就行了。后面解了没有意义; 接着分析 78 00 05 dc 00 00 0b b8 00: 第一个 字节 78 = 01111000 取 前5位 01111 = 15 表示定义分割的位数 我们在重新算一下需要的数组数,5(定义位数)+(xmin,xmax,ymin,ymax)×15(定义位数的值)=65; 也就是要取8个字节(这里两位十六进制算一个字节,区别与常规的字节) 接着 要 取 8 位 读取 78 00 05 dc 00 00 0b b8 00 换成2进制 : 0111 1000 0000 0000 0000 0101 1101 1100 0000 0000 0000 0000 00 00 1011 1011 1000 0000 0000 接着按位排列下: 01111+ 00000000000000(xmin)+ 010111011100000(xmax) +00000000000000 (ymin)+001011101110000(ymax)+ 000 代表的意义: (定义位数5)+(xmin=0) (xmax=12000) (ymin=0) (ymax=60000) +(多余的) 得到的值 width = (xmax-xmin)/20 ; height = (ymax-ymin)/20; 说明:SWF文件格式中所有的x-y 坐标信息都被存为整数,计量单位称作缇(twips)。在SWF 中,1缇是1/20个逻辑像素 最后得到的 SWF 文件的尺寸大小:600×300;