我想写一个小类,添加一个显示SWF从Flash发布的日期的日/月框。
我工作的公司经常生产很多很多的主权财富基金和每个主权财富基金的许多版本,在几个月的过程中迭代。我们用来与客户交流的一个版本跟踪系统是一个日/月日期框,它给出了SWF的发布日期。到目前为止,我们一直在手工填写发布日期。如果有任何方法可以用ActionScript编程来实现这一点,那就太棒了。
有什么见解吗?基本上,我所需要的就是提供发布日期的调用,甚至..任何关于发布SWF的情况,我可以用来滚成某种形式的..。自动版本识别,此SWF唯一的。
那么,ActionScript能判断出主权财富基金是什么时候发布的吗?
发布于 2010-11-12 08:53:04
乔治是对的。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");
}SWF规范:http://www.adobe.com/content/dam/Adobe/en/devnet/swf/pdf/swf_file_format_spec_v10.pdf
发布于 2010-09-26 07:11:32
你也可以使用强大的as3swf库从SWF字节码中读取数据。查看this。
发布于 2010-04-17 09:44:18
恐怕你不能在Actionscript中做到这一点。根据您构建swfs的方式,可能有几个选择。例如,如果使用Flash IDE,则可以使用JSFL script发布swf。这个jsfl可以替换一个占位符变量,您将在其中存储发布日期和发布swf (很长时间没有编写JSFL脚本了,但是让它工作起来应该不会太难)。
因此,假设您有一个Version类:
public class Version {
public var publicationDate:Date = new Date();
}您的脚本应该读取该类所在的文件,找到该行并将其替换为当前日期:
如下所示:
var curDate = new Date();
var dateLine = "public var publication:Date = new Date(" + curDate.getFullYear() + "," + curDate.getMonth() + "," + curDate.getDate() +");";https://stackoverflow.com/questions/2656827
复制相似问题