エンディアンを指定したバイナリデータの読み書き
あっちのタグはつけません。
世の中には、どうしてかは存じませんが、エンディアンが混在するバイナリ書式のものがございまして、ふとこれをAirで読み書きできんかなと思った次第。"binbig" と "binltl" の二つのテキストボックスを貼り付け、readLocalBinBigFile()などを駆動するボタンも用意。
そのうえで、次に示す関数を用意しました。
function readLocalBinBigFile() { document.getElementById('binbig').value = readLocalBinFile("LocalBinBig.dat", "bigEndian"); } function readLocalBinLtlFile() { document.getElementById('binltl').value = readLocalBinFile("LocalBinLtl.dat", "littleEndian"); } function readLocalBinFile(file, endian) { var f = air.File.applicationStorageDirectory.resolvePath(file); var st = new air.FileStream(); try { st.open(f,air.FileMode.READ); } catch(e) { alert('Read: Open Error: ' + e); return NaN; } try { st.endian = endian; var data = st.readInt(); st.close(); return data; } catch(e) { alert('Read: Read Error: ' + e); st.close(); return NaN; } } function writeLocalBinBigFile() { writeLocalBinFile("LocalBinBig.dat", "bigEndian", parseInt(document.getElementById('binbig').value)); } function writeLocalBinLtlFile() { writeLocalBinFile("LocalBinLtl.dat", "littleEndian", parseInt(document.getElementById('binltl').value)); } function writeLocalBinFile(file, endian, value) { var f = air.File.applicationStorageDirectory.resolvePath(file); var st = new air.FileStream(); try { st.open(f,air.FileMode.WRITE); } catch(e) { alert('Write: Open Error: ' + e); return; } try { st.endian = endian; st.writeInt(value); st.close(); } catch(e) { alert('Write: Write Error: ' + e); return; } }
意外とできるもんなんだとちょっと感動。