3

ネットワーク経由で24ビットの数値を送信するメッセージを作成しています。リトルエンディアンのマシンの場合、コードは次のとおりです(ptrはメッセージバッファへのポインタです)。

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

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

num2|num1|num0ビッグエンディアンマシンでエンコードするためのコードは何ですか?

4

4 に答える 4

3

ここでの問題は、メッセージがどのバイト順序で送信/作成されるかということです。エンディアンに依存しない方法ですでに個々のバイトにnum分割しているため、リトルエンディアンまたはビッグエンディアンのどちらのマシンを使用しているかは関係ありません。num

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

*ptr++ = (num)       & 0xFF;
*ptr++ = (num >> 8)  & 0xFF;
*ptr++ = (num >> 16) & 0xFF;
于 2010-10-19T06:49:38.493 に答える
2

コードは、エンディアンに関係なく移植可能です。シフト演算子>> <<は、表現ではなく値を処理します。

于 2010-10-19T07:13:11.330 に答える
0

受信側のマシンでは、エンディアンに関係なく、ptrに格納されているのと同じ順序で受信する場合は、次のように組み立てます。

num = (ptr[0] << 16) + (ptr[1] << 8) + (ptr[2]);
于 2010-10-19T08:07:25.007 に答える
0
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ビット値を取得します。

于 2010-10-19T09:17:57.787 に答える