ActionScript 可以判断 SWF 的发布时间吗? [英] Can ActionScript tell when a SWF was published?

查看:19
本文介绍了ActionScript 可以判断 SWF 的发布时间吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想编写一个小类,添加一个日/月框,显示从 Flash 发布 SWF 的日期.

I'd like to write a little class that adds a Day/Month box showing the date a SWF was published from Flash.

我工作的公司经常制作很多很多 SWF 文件,每个文件都有很多版本,在几个月的时间里不断迭代.我们一直用来与客户沟通的版本跟踪系统是一个日/月日期框,它给出了 SWF 的发布日期.到目前为止,我们一直在手动填写发布日期.如果有任何方法可以使用 ActionScript 以编程方式执行此操作,那就太棒了.

The company I work for regularly produces many, many SWFs and many versions of each, iterating over the course of months. A version-tracking system we've been using to communicate with our clients is a Day/Month date-box that gives the date the SWF was published. Up until now, we've been filling in the publish date by hand. If there's any way I can do this programatically with ActionScript that'd be fantastic.

有什么见解吗?基本上,我所需要的只是给我发布日期的调用,或者甚至.. 任何有关发布 SWF 的情况的信息,我可以使用它转入某种形式的.. 自动版本标识,此 SWF 独有.

Any insight? Basically, all I need is the call that gives me the publish date, or even.. anything about the circumstances under which a SWF was published that I could use to roll into some form of.. automated version identification, unique to this SWF.

那么,ActionScript 能否判断 SWF 的发布时间?

So, can ActionScript tell when a SWF was published?

推荐答案

George 是正确的.Adobe 会在每个已编译的 swf 中隐藏一个未记录的 ProductInfo 标签,该标签包含编译日期.DisplayObject.loaderInfo.bytes 包含加载显示对象的完整未压缩 swf.

George is correct. Adobe sneaks an undocumented ProductInfo tag that contains the compilation date in to every compiled swf. The DisplayObject.loaderInfo.bytes contains the the complete uncompressed swf that loaded the Display Object.

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/DisplayObject.html#loaderInfo

因此,无需外部库(从显示对象)即可获取 swf 编译日期的最快方法:

So the quickest way to get the swf's compilation date without external libraries (from a Display Object):

import flash.utils.Endian;
import flash.display.LoaderInfo;
import flash.utils.ByteArray;
...

private function getCompilationDate():Date{
  if(!stage) throw new Error("No stage");

  var swf:ByteArray = stage.loaderInfo.bytes;
  swf.endian = Endian.LITTLE_ENDIAN;
  // Signature + Version + FileLength + FrameSize + FrameRate + FrameCount
  swf.position = 3 + 1 + 4 + (Math.ceil(((swf[8] >> 3) * 4 - 3) / 8) + 1) + 2 + 2;
  while(swf.position != swf.length){
    var tagHeader:uint = swf.readUnsignedShort();
    if(tagHeader >> 6 == 41){
      // ProductID + Edition + MajorVersion + MinorVersion + BuildLow + BuildHigh
      swf.position += 4 + 4 + 1 + 1 + 4 + 4;
      var milli:Number = swf.readUnsignedInt();
      var date:Date = new Date();
      date.setTime(milli + swf.readUnsignedInt() * 4294967296);
      return date; // Sun Oct 31 02:56:28 GMT+0100 2010
    }else
      swf.position += (tagHeader & 63) != 63 ? (tagHeader & 63) : swf.readUnsignedInt() + 4;
  }
  throw new Error("No ProductInfo tag exists");
}

SWF 规范:http://www.adobe.com/content/dam/Adobe/en/devnet/swf/pdf/swf_file_format_spec_v10.pdf

这篇关于ActionScript 可以判断 SWF 的发布时间吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆