2009年
4月
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2009-04-15 rubyでbinaryの解析

_ 有効数字

まれに、binaryのデータを扱う必要が出てくる場合がある。データ構造が公開されている場合には問題無いのだが、それが公開されていない場合には、自分で解析する必要がある。

時々使用するある装置のデータはbinaryで保存されていて、普段はこれを付属のtoolでasciiにしている。この時の操作が面倒なので、以前に変換プログラムを書こうと思ったが、構造が分からずに挫折していた。最近、また思い立って解析を試みた。このとき、rubyのunpackを思い出して、これを使ったところ、最低限の解析に成功した。

整数の場合は、データの並びを見れば大体予想ができるが、今回は小数を扱っていたので、データを見てもいまいち分からなかった。結局、dataにbinaryを入れて、

p data.unpack("E")
などとして、それっぽい数字が出てくるものを探していった。

最終的には、すべてのデータはdoubleで保存されていただけだったのだが、これは予想外だった。有効数字が6桁ぐらいしかないのに、floatでも十分なのだが。実際、asciiに変換したものの方がファイルサイズが小さくなっている。binaryで保存している意味が無いような気がする。データを解析する前に、このことに気がついていれば、doubleだと推定できたのかもしれないが、最初はfloatぐらいだろうと思って、いろいろと試していて、時間がかかってしまった。