今まであんまりソース書いてどうこう、というのをやってなかったので、今日はやってみます。
内容は基本的なことだと思うので、
「何をいまさらこんなこと書きやがって」ということを思う方もいるとは思いますが、そこは許して下さい。許して下さい。
テーマは、『ByteArrayを使ってバイナリで文字を判定しよう』ということです。
今回は、読み込もうとしているデータがflvファイルであるかどうかを判定するというものです。
仕様であるかをしっかり確認した訳ではないのですが、バイナリエディタでflvを開いてみると、画像
http://blog.hi-farm.net/images/flv.jpg
の様に、
頭に『FLV』と書いているのを発見しました。
なので、ファイルの先頭に『FLV』と書いていれば.flvファイルである、という判定方法です。
そして、別にflexプロジェクトでも別に良かったのですが、今回はAIRで作ってみました。
以下、ソースです。
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:WindowedApplication xmlns:mx=”http://www.adobe.com/2006/mxml”; layout=”absolute” creationComplete=”initApp()”>
<mx:Script>
<![CDATA[
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.utils.ByteArray;
private var f:File;
private var fs:FileStream;
private var byteAry:ByteArray;
private function initApp():void{
var path:String = “/example.flv”; //取得したいパス
retreiveFileData(path);
}
private function retreiveFileData(path:String):void{
try{ //tryしておかないと、エラーが起きたときに止まってしまう
f = new File(path);
fs = new FileStream();
byteAry = new ByteArray();
fs.open(f, FileMode.READ);
fs.readBytes(byteAry, 0, fs.bytesAvailable); //全部頂く!(バイナリで)
var result:Boolean = retreiveFLV_Binary(byteAry);
if(result) result_ta.text = “This File is valid FLV file.”;
else result_ta.text = “This File is NOT valid FLV file.”;
}
catch(e:Error){
result_ta.text = e.message; //エラーメッセージを表示
}
finally{
fs.close(); //何が起きてもストリームを閉じます
}
}
private function retreiveFLV_Binary(ba:ByteArray):Boolean{
/*
ちなみに、FLVの仕様では、一番始めに、”FLV”という文字が入っているようです。
なので、FLVの文字が入っているかどうかを調べます。Byteで。
ちなみに、F L V のバイト表現は、
文字 : バイト表現
F : 46
L : 4C
V : 56
です。ファイルの頭にこのデータがあれば、FLVと見なします。
*/
//この辺はもっといい書き方があるはず。
var FLV_byte:Array = [parseInt(“0x46”,16),parseInt(“0x4C”,16),parseInt(“0x56″,16)]; //FLVのByte表現
var ba_ary:Array = [ba[0],ba[1],ba[2]]; //調べる対象のByteArrayをArrayに分けた配列
//判定結果を返す変数。 3行下に、『!=』 と書いている通り、resがfalseになる場合の判定を
//しているので、resのデフォルト値はtrue。
var res:Boolean = true;
for(var i:int = 0; i < 3; i++){
if(FLV_byte[i] != ba_ary[i]){ //データが違ってたらその場でループ終了
res = false;
break;
}
}
return res;
}
]]>
</mx:Script>
<mx:VBox>
<mx:Label text=”バイナリのFLVデータ” />
<mx:TextArea id=”result_ta” width=”300″ height=”300″ />
</mx:VBox>
</mx:WindowedApplication>
これをパブリッシュすると、
18行目のpathで指定されたファイルがflvの場合は、
“This File is valid FLV file.”
違う場合は、
“This File is NOT valid FLV file.”
と表示されます。
多分、「こんな書き方よりこの方が速い!きれい!」などあると思います。もしよろしければつっこんでやっていただけると大変うれしいです。
2007年9月15日02:15