ビッグエンディアンマシンで4バイトの整数から読んだ後、24ビットメッセージを書く方法(c)?

StackOverflow https://stackoverflow.com/questions/3965873

  •  09-10-2019
  •  | 
  •  

質問

ネットワーク上に24ビット番号を送信するメッセージを作成しています。リトルエンディアンマシンの場合、コードは(PTRはメッセージバッファーへのポインターです):

*ptr++ = (num >> 16) & 0xFF;
*ptr++ = (num >> 8)  & 0xFF;
*ptr++ = (num)       & 0xFF;

(したがって、num0、num1、num2、およびnum3がnumを構成する個々のバイトである場合、メッセージは次のようにエンコードされます num2|num1|num0.)

エンコードのコードは何ですか num2|num1|num0 大きなエンディアンマシンで?

役に立ちましたか?

解決

あなたのコードは、endianessに関係なくポータブルです。シフト演算子 >> << 表現ではなく、値を使用します。

他のヒント

ここでの問題は、どのバイト順序で メッセージ 送信/構築されますか?あなたが少しのエンディアンマシンにいるかどうかは重要ではないからです num, 、あなたがすでに分割しているので num エンディアンに依存しない方法で個々のバイトに。

投稿したコードは、24ビットを保存しています num ビッグエンディアン(別名ネットワークバイトオーダー)。だからそれがあなたが望むものであるならば、あなたはすでに終わっています。代わりにBig Littleに保存したい場合は、順序を逆にしてください。

*ptr++ = (num)       & 0xFF;
*ptr++ = (num >> 8)  & 0xFF;
*ptr++ = (num >> 16) & 0xFF;

受信マシンでは、エンディアン性に関係なく、PTRに保存されているのと同じ順序でそれらを受け取った場合、次のように組み立てます。

num = (ptr[0] << 16) + (ptr[1] << 8) + (ptr[2]);
int main(int argc, char** argv) {

    int a, b;
    a = 0x0f000000;        // Contain 32 bit value
    printf("before = %d\n", a);
    b = a & (~0xff000000); // convert the last 8 bits to zero so we got only 24 bit value in b
    printf("After = %d\n", b);
    return (EXIT_SUCCESS);
}

32ビットの値を含む数字がありますが、数値Bには24ビットしか含まれていません。そして、それは、ビットワイズ演算子がメモリ表現で動作しないため、エンディアンネスに依存しません。

したがって、使用できます

num = num & (~0xff000000);

最後の24ビット値を取得します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top