sigfoxにデータを送信する際に、floatデータならそのまま4byteデータとして送信するが、これの復元で調べまくった。
25.9964371は、41cff8b4 と表現される。これは、c言語で共用体を使えばそれほど難しくない。
union {
unsigned long longDeg;
float floatDeg;
} temp32;
floatデータとして変数に格納すればlong整数で取り出せ、その逆も然り。このデータをmatlabで復元したいが、matlabは標準でdoubleになっていて、単精度浮動小数だとうまくいかない
hex2num('41cff8b4') は、1.072785408000000e+09 と算出されてしまう。41cff8b4を倍精度に変えてしまえば良い。ここに変換サイトがある。
https://gregstoll.dyndns.org/~gregstoll/floattohex/
上記ページで、41cff8b4 → 4039ff141205bc02 これをhex2numに入れれば正しく変換される。数千もデータがあるのに毎度やってられない。単精度で変換できないか探してようやく見つけた。
https://jp.mathworks.com/matlabcentral/fileexchange/6927-hexsingle2num
この記事は2005年のもののようだ、クレジットを入れれば再配布可能とあるので、ここに添付する。しかし、このページのコメント欄には、もっとシンプルな記述が記載されている。コメントは2017ごろのようである。昔はできなかったが、今はできる、ということなのかもしれない。
typecast(uint32(hex2dec('41cff8b4')),'single')
ans =
single
25.9964371
これ、共用体と同じ使い方ですよね。そこまで頭は回らんですね、私の場合・・・
コメントを追加