Adobe FlashのSWFファイルの情報を表示します。
package { import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.net.FileFilter; import flash.net.FileReference; import flash.utils.ByteArray; import flash.utils.Endian; import com.bit101.components.*; [SWF(width = "380", height = "200", frameRate = "30")] public class SwfInformation extends Sprite { private var label1:Label; private var label2:Label; private var fileReference:FileReference; private var productInfoProducts:Vector.<String> = Vector.<String>([ "unknown", "Macromedia Flex for J2EE", "Macromedia Flex for .NET", "Adobe Flex" ]); private var fileAttributesString:Vector.<String> = Vector.<String>([ "UseDirectBlit", "UseGPU", "HasMetadata", "ActionScript3", "SuppressCrossDomainCaching", "SwfRelativeUrls", "UseNetwork" ]); public function SwfInformation() { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; Style.LABEL_TEXT = 0x333333; new PushButton(this, 5, 5, "LOAD", loadSwf); label1 = new Label(this, 5, 25); label2 = new Label(this, 135, 25); } private function loadSwf(event:MouseEvent):void { fileReference = new FileReference(); fileReference.addEventListener(Event.SELECT, onLoadSwfSelect); fileReference.browse([new FileFilter("SWF File", "*.swf")]); } private function onLoadSwfSelect(event:Event):void { fileReference.addEventListener(Event.COMPLETE, onLoadSwfComplete); fileReference.load(); } private function onLoadSwfComplete(event:Event):void { fileReference.removeEventListener(Event.SELECT, onLoadSwfSelect); fileReference.removeEventListener(Event.COMPLETE, onLoadSwfComplete); var data:ByteArray = ByteArray(fileReference.data); var headBuf:ByteArray = new ByteArray(); var dataBuf:ByteArrayEx = new ByteArrayEx(); headBuf.endian = Endian.LITTLE_ENDIAN; dataBuf.endian = Endian.LITTLE_ENDIAN; data.readBytes(headBuf, 0, 8); data.readBytes(dataBuf); if (headBuf[1] == 0x57 && headBuf[2] == 0x53) { // if (headBuf[0] == 0x46) { // } else if (headBuf[0] == 0x43) { dataBuf.uncompress(); } } var label1Str:String = ""; var label2Str:String = ""; label1Str += "Signature: " + headBuf.readMultiByte(3, "us-ascii") + "\n"; label1Str += "Version: " + headBuf.readUnsignedByte() + "\n"; label1Str += "FileLength: " + headBuf.readUnsignedInt() + "\n"; var nBits:int = dataBuf.readBits(5); label1Str += "FrameSize:\n"; label1Str += "\tXmin: " + (dataBuf.readBits(nBits) / 20) + "\n"; label1Str += "\tXmax: " + (dataBuf.readBits(nBits) / 20) + "\n"; label1Str += "\tYmin: " + (dataBuf.readBits(nBits) / 20) + "\n"; label1Str += "\tYmax: " + (dataBuf.readBits(nBits) / 20) + "\n"; dataBuf.positionAlignment(); label1Str += "FrameRate: " + (dataBuf.readUnsignedShort() / 0x100) + "\n"; label1Str += "FrameCount: " + dataBuf.readUnsignedShort() + "\n"; var tag:int; var tagType:int, tagSize:int; var tagNextPosition:int; do { tag = dataBuf.readUnsignedShort(); tagType = tag >> 6; tagSize = tag & 0x3F; if (tagSize == 0x3F) { tagSize = dataBuf.readUnsignedInt(); } tagNextPosition = dataBuf.position + tagSize; if (tagType == 41) { label2Str += "ProductInfo:\n"; label2Str += "\tProduct: " + productInfoProducts[dataBuf.readUnsignedInt()] + "\n"; dataBuf.position += 4; label2Str += "\tVersion: " + dataBuf.readUnsignedByte() + "." + dataBuf.readUnsignedByte() + "\n"; label2Str += "\tBuild: " + dataBuf.readUnsignedLong() + "\n"; var compileDate:Date = new Date(); compileDate.setTime(dataBuf.readUnsignedLong()); label2Str += "\tCompileDate: " + compileDate.toLocaleString() + "\n"; } if (tagType == 69) { label2Str += "FileAttributes:\n"; dataBuf.readBits(1); for (var i:int = 0; i < 7; i++) { label2Str += "\t" + fileAttributesString[i] + ": "; label2Str += dataBuf.readBits(1) ? "true" : "false"; label2Str += "\n"; } } dataBuf.position = tagNextPosition; } while (tagType != 0); label1.text = label1Str; label2.text = label2Str; headBuf.clear(); dataBuf.clear(); } } } import flash.utils.ByteArray; import flash.utils.Endian; class ByteArrayEx extends ByteArray { private var bitPosition:int; public function ByteArrayEx() { bitPosition = 0; } public function readUnsignedLong():Number { var value1:Number, value2:Number; value1 = readUnsignedInt(); value2 = readUnsignedInt(); if (endian == Endian.BIG_ENDIAN) { value1 *= 0x100000000; } else { value2 *= 0x100000000; } return value1 + value2; } public function positionAlignment():void { if (bitPosition > 0) { position++; bitPosition = 0; } } public function readBit():int { var value:int = this[position]; value = (value >> (7 - bitPosition++)) & 1; if (bitPosition > 7) { position++; bitPosition = 0; } return value; } public function readBits(length:int):int { var value:int = 0; for (var i:int = 0; i < length; i++) { value <<= 1; value |= readBit(); } return value; } }