バイナリ形式でデータを埋め込む

(サンプル一覧を表示する)

FlashDevelop を使って、バイナリ形式でデータを埋め込むテストをしてみました。

Embed キーワードの mimeType に、 "application/octet-stream" を指定することで
どんな形式のデータでも埋め込むことができます。
インスタンス化は ByteArray 形式で行いますので、
Flash では直接扱えない形式の画像データ等を埋め込む場合は、
表示できる形式に変換するコードを自力で作る必要があります。

Adobe Alchemy を使うことで既存のオープンソースの画像デコーダ等を移植できるかもしれません。
Flash の実行画面
バイナリ形式でデータを埋め込む

Flashプレーヤーが入っていないか、JavaScriptが無効になっているようです。

Get Adobe Flash player

バイナリ形式でデータを埋め込む

ソースコード

package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.TextField;
	import flash.utils.ByteArray;
	
	/**
	 * バイナリ形式でデータを埋め込むサンプル
	 * @author Hikipuro
	 */
	public class Main extends Sprite 
	{
		/**
		 * 埋め込みテキストデータ
		 */
		[Embed(source='../data/test001.txt', mimeType='application/octet-stream')]
		private var embedTextData:Class;
		
		/**
		 * 埋め込みアイコンデータ (画像としては表示できません)
		 */
		[Embed(source='../data/test002.ico', mimeType='application/octet-stream')]
		private var embedIconData:Class;
		
		/**
		 * 結果表示用テキストフィールド
		 */
		private var textField:TextField;
		
		
		/**
		 * コンストラクタ
		 */
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		/**
		 * 初期化メソッド
		 * @param	e
		 */
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			// 結果表示用テキストフィールドの初期化
			textField = new TextField();
			textField.width = 320;
			textField.height = 240;
			addChild(textField);
			textField.appendText("[埋め込みテキストデータの表示]\n\n");
			
			// 埋め込みテキストデータを ByteArray 形式でインスタンス化する
			var byteArray:ByteArray;
			byteArray = new embedTextData as ByteArray;
			
			// ByteArray からテキストを読み込んで画面に表示
			var text:String = byteArray.readUTFBytes(byteArray.length);
			textField.appendText(text);
			
			// テキストフィールドに文字列を足す
			textField.appendText("\n\n\n");
			textField.appendText("[アイコンデータの表示] (先頭 32 バイトのみ)\n\n");
			
			// アイコンデータを ByteArray 形式でインスタンス化する
			byteArray = new embedIconData as ByteArray;
			
			// アイコンデータを 1 バイトずつ読み込んで画面に表示する
			for (var j:int = 0; j < 4; j++) {
				for (var i:int = 0; i < 8; i++) {
					var byte:uint = byteArray.readUnsignedByte();
					textField.appendText(hex(byte, 2) + " ");
				}
				textField.appendText("\n");
			}
		}
		
		/**
		 * 数値を 16 進数形式の文字列にする
		 * @param	n		変換したい数値
		 * @param	figures	ゼロ埋めする桁数
		 */
		private function hex(n:uint, figures:int):String 
		{
			var text:String = n.toString(16);
			text = text.toUpperCase();
			while (text.length < figures) {
				text = "0" + text;
			}
			return "0x" + text;
		}
	}
	
}
		

外部リンク