は、ポータブルかつ安全な安全応じエンディアン、であるために、あなたはあなたのデータを再作成する必要があります。
speed = ((uint32_t)data[0]) << 24
| ((uint32_t)data[1]) << 16
| ((uint32_t)data[2]) << 8
| ((uint32_t)data[3]);
または
speed = ((uint32_t)data[3]) << 24
| ((uint32_t)data[2]) << 16
| ((uint32_t)data[1]) << 8
| ((uint32_t)data[0]);
チューあなたは直接の配列代入することはできませんので、あなたがエラー「配列型を持つ式に代入」を取得
最上位バイトの南東ソリューション応じてポジション:data=(uint8_t*)speed;
は完全にCで禁止されている、あなたは明確にすることはできません左辺の配列。最上位バイトの位置に従って、
data[0] = (uint8_t)((speed >> 24) & 0x00FF);
data[1] = (uint8_t)((speed >> 16) & 0x00FF);
data[2] = (uint8_t)((speed >> 8) & 0x00FF);
data[3] = (uint8_t)(speed & 0x00FF);
か:あなたは逆の操作を行う必要があり
data[3] = (uint8_t)((speed >> 24) & 0x00FF);
data[2] = (uint8_t)((speed >> 16) & 0x00FF);
data[1] = (uint8_t)((speed >> 8) & 0x00FF);
data[0] = (uint8_t)(speed & 0x00FF);
EDITを
はに言及としてキャストやmemcpy
を使用しないでください 解説と元の答え:非移植性の問題に加えて、整列の制約とaliによると、セキュリティの問題が発生しますいくつかのプラットフォームでは、コンパイラが間違ったコードを生成する可能性があります - user694733 | hereを参照してください - ランディン
のおかげで
speed = *((uint32_t *)data); // DANGEROUS NEVER USE IT
*((uint32_t *)data) = speed; // DANGEROUS NEVER USE IT
'* data'は実質的に' data [0] 'と同等です。明らかにそれは動作しません。 –
'volatile uint8_t data [4]'は静的配列です。この配列の名前を式で使用すると、その型のポインタに崩壊する 'prvalue'という意味になります。 'data =(uint8_t *)スピード;' –
おそらくspeed =(uint32_t)*データの代わりにspeed = *(uint32_t *)データを書きます。 –