[Javascript] ファイルをバイナリ操作する方法 #3 数値計算

2020年2月23日

Javascript テクノロジー プログラミング 特集

t f B! P L
こんにちわ。 算数は得意だけど、数学や物理は苦手なナンチャッテ・エンジニアのユゲタです。 最近流行りのAIを勉強する際に、必ず難しい数学式が出てくるんですが、これって高校の数Ⅱで習っていると言われました。 ホンマかいな??? 覚えてないぞ!! でも、数学はこれから勉強しても遅く有りません。 そんな通常の数学では習わないバイナリデータを計算してみたいと思います。

バイナリ内の数値計算

mp3のid3タグの仕様を見ていると、各種データ毎にサイズが書かれていることに気がつくと思いますが、 バイナリデータには、データ内の情報が、どのアドレスに書き込まれているかが記載されています。 具体的には、開始アドレスと、そのデータのサイズが書かれているんですが、開始アドレスは、直前データの終了アドレスの次のバイトアドレスになりますが、データサイズは、一定のサイズ計算ではなく、ビット数も違えば、該当サイズが書かれているバイト数も違っているため、仕様書を見て判断しなければいけません。 今回は、mp3id3タグのv2データでの計算をやってみたいと思います。 ヘッダ箇所の仕様は、次のようになっています。 size (4:7-10) $ xx,xx,xx,xx アドレスは7バイトから10バイトの4バイト分で、それが7bitの計算をするとの事です。 データの取得は、前回記事で行ったやり方と同じで、以下のような関数を書いて対応してみました。 // inputタグからfileAPIにアクセス var input = document.querySelector("[type='file']"); var file = input.files[0]; // ファイルからバイナリデータを取得 var reader = new FileReader(); reader.readAsArrayBuffer(file); reader.onload = bin_loaded; // 読み込んだバイナリデータ処理 function bin_loaded(e){ var binary = e.target; var tag_arr = data.slice(7, 10); var size = calcSize(tag_arr , 7); console.log(size); } function calcSize(bites , bit){ var num = 0; for(var i=0; i<bites.length; i++){ var shift = (bites.length - 1 - i); if(shift){ num += bites[i] << (bit * shift); } else{ num += bites[i]; } } return num; }

解説

単一のバイトアドレスにかかれている数値であれば、その単体バイトの値でいいのですが、その場合は、0-255までの数値しかとうろくできないため、それ以上の場合は、複数バイトに格納されている事があります。 今回はそのケースの対応ですが、4バイト分に書かれたバイト値の計算は次のようになっています。 1バイト目 : 数値に、ビット数 × 3をかける 2バイト目 : 数値に、ビット数 × 2をかける 3バイト目 : 数値に、ビット数 × 1をかける 4バイト目 : 数値 上記の4つを足すことで、サイズ値が計算されます。 今回の関数では、ビット数が変わった場合と、アドレスのバイト数が変わった場合も使えるようにしてあるため、今後も便利に使えると思います。 普段、バイナリデータを扱わない人にとって、こうした計算はなかなか難しく感じますが、慣れてくると意外と簡単で、仕様にかかれている通りにファイルからデータが取得できるようになると、 これまで出来なかった領域に踏み込めた感じがして楽しくなってきます。 エンジニアとしての視点が開眼する感じがしますねwww

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ