はじまり
floatデータをバイト配列から復元する必要があり、Arduinoのエンディアンはどっちなのだろうといつものgoogleにお世話になる。AVRのデータシート見ろは無しで。
記事が古いがちょっと面白かった。分かってない人が見るとちんぷんかんぷんだ。Arduinoはリトルエンディアンと書かれているし、これ以上深入りしなくてもいいが。
深入りした結果
int ⇒ char 変換を考えると 4バイト ⇒ 1バイト。
ビッグエンディアンで 1000 番地から 0x12345678 を格納してみる。
1000 0x12 ⇒ 1000 0x12 (アドレス参照 の動き)
1001 0x34
1002 0x56
1003 0x78 ⇒ 1003 0x78 (キャスト の動き)
リトルエンディアンで 1000番地から 0x12345678 を格納してみる。
1000 0x78 ⇒ 1000 0x78 (アドレス参照・キャスト の動き)
1001 0x56
1002 0x34
1003 0x12
アドレス変化の無いリトルエンディアンが機械に優しい。また、TCP/IPなんかで使われるネットワークバイトオーダーは人間に優しいビッグエンディアン。ぱっと思いつくソースコードは下記。
#include <stdio.h>
int main(void) {
unsigned long u32 = 0x12345678UL;
printf(" char : %x\n", (char)u32);
printf("*char*: %x\n", *(char*)&u32);
return 0;
}
しまった。Arduino は printf が使えない。リトルエンディアンってことにしておこう。
余談
正直jsonやら何やら文字列表現してしまう環境の中、必要になる状況はあまりない。しかしQiitaにも多数投稿がある。プログラミング界の蟻地獄。