2011年9月14日水曜日

String#unpack!

VC++とWindowsで遊ぼうかと思ったら、VC2010のSP1インストールで盛大にトラブってまだ終わらないので、Rubyの小ネタで場をつなぐ。

Rubyでフォーマットのあるバイナリを読み込む場合、String#unpackを使うのがよくあるパターン。とはいえ使いづらい点もあって

  1. フォーマット文字列が長さ情報を持っているのに、何バイト読んだかの情報が取れない
  2. unpack自体はデータを消費しないので、次のデータを読もうとすると自分で進めないといけない

これで、例えばデータ自体の内容によってフォーマットが切り替わるようなデータを処理しようとすると、フォーマットから長さを計算して固定長切り出してフォーマットに従ってunpackして……という鉄板コードが並ぶことに。

やってられないので、こんなのを考えてみた。



unpackした結果をpackし直して長さを求めるという手抜きかつ富豪な実装だけど、これだけでデータ処理コード自体の見通しはだいぶ良くなったりする。

0 件のコメント:

コメントを投稿