Modbus RTUプロトコルを使用してシリアルポート経由でデバイスと通信しています。データは8ビットのバイトとして取り込まれます。解析の後、私は1つの32ビットフィールドに「結合」したい4バイトで終わります。 次のように私はこれをやっている:シリアルポート経由でデータを入力します。ビットをintやfloatなどの型に解析します。
unsigned char bytes[4];
int field;
field = (0x000000FF & bytes[0]);
field = (field << 8);
field = (field & 0x0000FF00);
field = (field | bytes[1]);
field = (field << 8);
field = (field & 0x00FFFF00);
field = (field | bytes[2]);
field = (field << 8);
field = (field & 0xFFFFFF00);
field = (field | bytes[3]);
しかし、同僚は、この方法は、異なるシステム上で予期しない結果を有していてもよく、それは、さらに、それがフロートまたはlong型では動作しない可能性があることを私に言いました。 誰かが私にこの理由を説明することはできますか?可能であれば、可能な限り、異なるシステム間で一貫した結果をもたらす方法で上記の作業をどのように達成するかを教えてください。ありがとう!
まず(と成長するリスト)intが(あなたがバイト順(ここでは、ネットワークバイトオーダーを想定かもしれないがわからない場合 –
第二には、あなたが完全に失われます(それは何もすることができます)ではない32ビットであり、ビッグエンディアン)) –
第3に、浮動小数点値は、期待する浮動小数点値ではない可能性があります。異なるサイズに加えて、異なる表現が可能である。 –