バイナリファイルをC言語のデータ配列に変換する [Arduino]
大きなデータを扱うにあたり、ファイル操作が可能なシステムならファイルの読み書きで対応が可能ですが、Arduino単体ではプログラム領域上にデータを持つしかありません。
数~数10kBのFlashメモリにデータを置き、そこから読み込むということになります。
テキストデータならプログラム上に載せるのもなんとかなりそうですが、バイナリデータの場合にはデータをどうやって持ってくるか考えてしまいます。
通常大きなデータというのはファイルに保存されているので、それをそのまま配列に変換するのが現実的と思います。
というわけで、HTML5 + JavaScript で変換スクリプトつくりました。
サンプルプログラムの寄せ集め+スタイルシートが雑ですが、Drag & Dropするだけなので使いやすいと思います。
次のコードをテキストエディタでhtmlとして保存します。HTML5なのでUnicode(UTF-8)です。
const uint8_t bindata[] PROGMEM = { ... };
のかわりに、
var bindata = [ ... ]; (最近はvarよりlet, const?)
にすれば、JavaScript にも応用が可能です。
数~数10kBのFlashメモリにデータを置き、そこから読み込むということになります。
テキストデータならプログラム上に載せるのもなんとかなりそうですが、バイナリデータの場合にはデータをどうやって持ってくるか考えてしまいます。
通常大きなデータというのはファイルに保存されているので、それをそのまま配列に変換するのが現実的と思います。
というわけで、HTML5 + JavaScript で変換スクリプトつくりました。
サンプルプログラムの寄せ集め+スタイルシートが雑ですが、Drag & Dropするだけなので使いやすいと思います。
次のコードをテキストエディタでhtmlとして保存します。HTML5なのでUnicode(UTF-8)です。
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<title>PROGMEM作蔵さん</title>
<style>
html, body { height: 90%; background:#ffffff; }
h1 { border:dotted 2px; border-radius:20px; padding:20px; }
h1, h3, p { color:#776666; text-align:center; margin:50px; }
code { color:#444444; font-size:75%; }
</style>
<script>
function DragOver( event ) {
event.preventDefault(); // ブラウザデフォルト処理(禁止マーク)を阻止
}
function Drop( event ) {
event.preventDefault(); // ブラウザデフォルト処理(ページ移動)を阻止
var f = event.dataTransfer.files[0]; // イベントに格納されたファイルを取り出し
var code = "<pre><code>"
code += "// " + "file name : " + f.name + "\n";
code += "// " + "file size : " + f.size + " bytes\n\n";
code += "const uint8_t bindata[] PROGMEM = {";
var reader = new FileReader();
reader.onloadend = function(){
var uint8array = new Uint8Array(reader.result);
for( var i = 0; i < f.size; i++) {
if( i != 0 ) code += ",";
if( !(i % 16) ) code += "\n ";
code += ( uint8array[i] > 15 ? "0x" : "0x0" );
code += ( uint8array[i].toString(16) );
}
code += "\n};\n\n</code></pre>";
document.getElementById("main").innerHTML = code;
};
reader.readAsArrayBuffer( f );
}
</script>
<body ondragover="DragOver(event);" ondrop="Drop(event);" id="main" >
<h1>PROGMEM作蔵さん</h1>
<h3>バイナリファイルをC言語のデータ形式に変換</h3>
<p>ここにファイルをドロップ</p>
</body>
</html>
const uint8_t bindata[] PROGMEM = { ... };
のかわりに、
var bindata = [ ... ]; (最近はvarよりlet, const?)
にすれば、JavaScript にも応用が可能です。
2016-10-16 08:54
nice!(0)
コメント(2)
トラックバック(0)
バイナリファイルの変換ソフトが見つからずに困っていたので助かりました!
by arduino初心者 (2021-10-25 00:02)
バイナリファイルを「0×()」の形にするのに難儀していました。
助かりました。
これでaruduinoで音声出せそうです。
by 風切屋 (2022-08-21 00:02)