メインコンテンツに移動

バイトHEX文字列を数値に変換する

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

これ、共用体と同じ使い方ですよね。そこまで頭は回らんですね、私の場合・・・

添付

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
  • 行と段落は自動的に折り返されます。