AS3的ByteArray可以用来操作二进制。使用它,我们就获取加载进来的SWF的尺寸。

首先要了解下SWF的文件结构,可以下载官方的PDF看下。

用UltraEdit32打开一个SWF,会看到第一个字节是43或46,这是16进制,对应的字符就是C或F,其中C表示压缩过的,F表示未压缩的。

第二个字节和第三个字节是固定的57 53.

接着1个字节表示Flash版本,比如08,就是Flash8的,0A就是Flash10的。

后面4个字节表示Flash文件大小(未压缩时的大小)

到此需要暂停一下。我们最开始就已经知道了这个文件是否是压缩过的,如果是已经压缩过的,需要对文件尺寸之后的字节进行解压缩,就是利用ByteArray.uncompress()。如果是未压缩的就略过这一步。

接下来将是一个Rect结构。它占用的字节数是不固定的。它由5部分组成,第一个是len,后面4个数是xmin,xmax,ymin,ymax。这4个数所占位数相同,都是len。

len由rect的前5位二进制决定。

举个例子,假如我们看到的Rect开始的二进制是这样70 00 0F A0 00 00 ……….

首先取第一个字节70,二进制就是0111 0000,前5位就是(01110)2= (14)10,就是10进制的14,也就是说后面的4个数xmin,xmax,ymin,ymax每个数都占14位,这样14*4=56;

而第一个字节还剩下3位,56-3=53.也就是说除了第一个字节外,我们还需要Math.ceil(53/8) = 7个字节,这里为什么要向上取整?因为字节对齐的关系。就是说,你用53位跟56位占用的空间是一样的,不够56也会补够56.

OK,原理就是这样,具体怎么做呢

private function calc_size(byte:ByteArray):void {   var char:String = String.fromCharCode(byte.readByte()); // C or F byte.readByte(); // W byte.readByte(); // S byte.readByte(); // version byte.readUnsignedInt(); // file size 32 bit if(char == "C") { var tmpByte:ByteArray = new ByteArray();
byte.readBytes(tmpByte);
byte = tmpByte;
byte.position = 0;
byte.uncompress(); } var bit:uint = byte.readUnsignedByte(); var bitLen:uint = bit >> 3; var bits:uint = bitLen * 4;
bits = Math.ceil((bits - 3) / 8); var num:int = bit & 0x07; var readed:int = 3; var sizeArr:Array = []; var sizeId:int = 0; var ava:int = 0; var avaNum:uint; var readCount:int = 0;
  do { if(ava == 0) { ava = 8;
readCount ++;
 
avaNum = byte.readUnsignedByte();
  }   if(readed < bitLen) { var offset:int = bitLen - readed; if(offset > ava) { num = (num << ava) | avaNum;
 
readed += ava;
ava = 0;
  } else { num = (num << offset) | (avaNum >> (ava - offset));
avaNum = avaNum - (avaNum >> (ava - offset));
 
ava -= offset;
readed += offset;
  }   } else { sizeArr[sizeId] = num;
sizeId ++; if(sizeId == 4) { break; } num = 0;
readed = 0; } }while(true);
srcW = sizeArr[1] / 20;
srcH = sizeArr[3] / 20; }

我们可以注意到最后求出的尺寸都做了除以20的处理,这是因为,我们求出来的数单位是twip,1 pixel = 20 twips。所以除以20就是我们熟知的像素了。

利用AS3的ByteArray解析SWF的尺寸的更多相关文章

  1. [AS3]as3用ByteArray来对SWF文件编码加密实例参考

    [AS3]as3用ByteArray来对SWF文件编码加密实例参考,简单来说,就是将 swf 以 binary 的方式读入,并对 ByteArray 做些改变,再重新存成 swf 档.这个作业当然也可 ...

  2. 解析swf文件头,获取flash的原始尺寸

    要想解析swf文件头,首先要弄清楚的当然是swf文件格式规范.规范中对swf文件格式作了详细的说明.关于swf文件头,它是由以下几个部分组成:+-------+---+--------+------- ...

  3. (全解析)屏幕尺寸,分辨率,像素,PPI之间到底什么关系?

    (全解析)屏幕尺寸,分辨率,像素,PPI之间到底什么关系? 产品经理马忠信关注 22015.08.30 13:59:20字数 2,660阅读 52,661 今天我给大家来讲讲这几个咱们经常打交道的词到 ...

  4. Java下利用Jackson进行JSON解析和序列化

    Java下利用Jackson进行JSON解析和序列化   Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行 ...

  5. python利用or在列表解析中调用多个函数.py

    python利用or在列表解析中调用多个函数.py """ python利用or在列表解析中调用多个函数.py 2016年3月15日 05:08:42 codegay & ...

  6. 温故知新,.Net Core利用UserAgent+rDNS双解析方案,正确识别并反爬虫/反垃圾邮件

    背景 一般有价值的并保有数据的网站或接口很容易被爬虫,爬虫会占用大量的流量资源,接下来我们参考历史经验,探索如何在.Net Core中利用UserAgent+rDNS双解析方案来正确识别并且反爬虫. ...

  7. buuoj [RoarCTF 2019]Easy Calc(利用PHP的字符串解析特性)

    web [RoarCTF 2019]Easy Calc(利用PHP的字符串解析特性) 先上源码 <?phperror_reporting(0);if(!isset($_GET['num'])){ ...

  8. 利用a标签特性解析地址(附加属性说明)

    首先我们看看实例 a.href = 'http://www.cnblogs.com/wayou/p/'; console.log(a.host); 控制台会输出 "www.cnblogs.c ...

  9. 利用 a 标签自动解析 url

    很多时候,我们有从 url 中提取域名,查询关键字,变量参数值等的需求,然而我们可以让浏览器方便地帮助我们完成这一任务而不用写正则去抓取.方法就是先创建一个 a 标签然后将需要解析的 url 赋值给  ...

随机推荐

  1. 关于真多核和加多核&线程由哪几部分组成

    网上查的资料小结,没有考证. 真多核是指一个cpu多个核心,即多个内核. 假多核是指多个cpu捆绑形成的分布式计算,ARM针对服务器市场推出的处理器为多个cpu的 真多核的应用奔腾和因特尔 双核芯cp ...

  2. MySQL之基础功能

    一.视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据 视图有如下特点: 1. 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系. 2. 视图是 ...

  3. JavaScript(获取或设置html元素的宽,高,坐标),确定和判断鼠标是否在元素内部,二级导航菜单鼠标离开样式问题解决

    设置: document.getElementById('id').style.width=value    document.getElementById('id').style.height=va ...

  4. 【PAT】1014. 福尔摩斯的约会 (20)

    1014. 福尔摩斯的约会 (20) 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hy ...

  5. 错误:Could not create the Android package. See the Output (Build) window for more details

    错误:Could not create the Android package. See the Output (Build) window for more details. Mono For An ...

  6. lr如何屏蔽全局变量的影响

    首先要熟悉C语言的全局变量和局部变量的含义: C语言中的变量详解 先说说变量的作用域,比如,在函数中,形参变量只是在被调用期间才分配内存单元,调用结束立即释放.这就说明形参变量只有在函授内才是有效的, ...

  7. PouchDB:JavaScript同步数据库

    简介 PouchDB是受 Apache CouchDB启发为Web设计的一款占用空间少的数据库.PouchDB项目的目标是帮助开发者构建线上和线下都能很好地使用的Web应用程序,在应用程序离线的时候, ...

  8. bzoj 1110 贪心 + 进制转换

    思路:感觉脑洞好大啊... 因为每两个砝码其中一个都是另一个的倍数,我们可以知道砝码的种数很少,我们将所有容器的 容量都转换成用这些砝码的重量的进制表示,然后将所有砝码排序,然后贪心地取,取到不能再取 ...

  9. Redis实战(七)

    修改数据 C#语言修改Redis示例. 1.通过key修改单个value using (var redisClient = RedisManager.GetClient()) { var user = ...

  10. Java利用Redis实现消息队列

    应用场景 为什么要用redis?二进制存储.java序列化传输.IO连接数高.连接频繁 一.序列化 这里编写了一个java序列化的工具,主要是将对象转化为byte数组,和根据byte数组反序列化成ja ...