5

以下にACプログラムがあります。32ビットメッセージを特定の順序で送信したいと思います(例:0x00000001)。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <stdint.h>

struct  test
{
    uint16_t a;
    uint16_t b;
};

int main(int argc, char const *argv[])
{
    char buf[4];
    struct test* ptr=(struct test*)buf;
    ptr->a=0x0000;
    ptr->b=0x0001;
    printf("%x %x\n",buf[0],buf[1]); //output is 0 0
    printf("%x %x\n",buf[2],buf[3]); //output is 1 0
    return 0;
}

次に、char配列の値を出力してテストします。上記のコメントで出力を得ました。出力は00と01であるべきではありませんか?but [3]が最後のバイトなので?見逃したことはありますか?

ありがとう!

4

3 に答える 3

7

そのリトルエンディアンを引き起こします。これを読んでください: エンディアン

それらをネットワーク順序に変換するには、htonl(host-to-network-long)およびhtons(host-to-network-short)変換関数を使用する必要があります。受信後、ネットワークからホストオーダーに変換するためntohlに関数を使用する必要があります。ntohsバイトが配列に配置される順序は、バイトをメモリに配置した方法によって異なります。それらを4つの別々の短いバイトとして配置すると、エンディアン変換は省略されます。charこの種の生のバイト操作にはtypeを使用できます。

于 2012-10-17T22:52:28.187 に答える
1

システムは数値をリトルエンディアンとして保存します

于 2012-10-17T22:53:21.167 に答える
0

Windows はデータを「リトルエンディアン」として保持するため、バイトが逆になります。詳細については、エンディアンを参照してください。

于 2012-10-17T22:58:58.277 に答える