ActionScript可以告诉SWF何时发布?

iva*_*ese 10 flash datetime actionscript-3

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

我工作的公司定期生产许多SWF,每个版本都有很多版本,在几个月内迭代.我们用来与客户沟通的版本跟踪系统是日/月日期框,它给出了SWF发布的日期.到目前为止,我们一直在手工填写发布日期.如果有任何方法,我可以使用ActionScript以编程方式执行此操作,这非常棒.

任何见解?基本上,我所需要的只是给我发布日期的电话,甚至是关于发布SWF的情况的任何信息,我可以使用它来进行某种形式的自动版本识别,这是SWF独有的.

那么,ActionScript可以告诉SWF何时发布?

Joo*_*ony 24

乔治是对的.Adobe将一个未记录的ProductInfo标记隐藏到每个编译的swf中,该标记包含编译日期.DisplayObject.loaderInfo.bytes包含加载显示对象的完整未压缩swf.

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

因此,在没有外部库(来自显示对象)的情况下获取swf编译日期的最快方法是:

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");
}
Run Code Online (Sandbox Code Playgroud)

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

  • +1.绝对酷.我不知道这个信息可以在swf开箱即用(好吧,至少在使用MXMLC编译时).如果我需要获取编译日期,我会记住这一点.我喜欢这样一个事实:你可以拥有这些数据,而不需要任何额外的构建时间技巧,也无需使用完整的解析器,如果您想要的只是那条信息,这似乎有点过分.顺便说一句,我不介意@spiralganglion接受这个答案而不是目前接受的答案,因为它明显比我的好;) (2认同)