0

次の要素を持つ構造体があります。さらに、構造は完全にパッドされています。

typedef struct {
    uint16_t a;
    uint16_t b;
    uint8_t c;
    uint8_t d;
    uint8_t e[6];
} ad;

この構造はリトルエンディアンです。つまり、この構造をビッグエンディアンマシンで印刷すると、次のようになります

c=1 の場合、d=2、e[0] =3、e[1]=4。私は得る

c=4、d=3、e[0] = 2、e[1]=1。

a と b が入れ替わっています。さらに、e[1] は c と交換され、e[0] は d と交換されます。

htonl以下のような関数を使用しています。しかし、それは機能していません。誰かが私に良い答えを提案できますか。

4

2 に答える 2

3

エンディアンネスは個々のフィールドにのみ適用され、構造体フィールドの順序には適用されません。リストするフィールドのうち、uint16_tとして定義されたマルチバイト整数フィールドのみがエンディアンによって管理されます。uint8_tはシングルバイトであるため、考慮すべき順序の問題はありません。シングルバイト値の配列も、エンディアンに関係なく同じ長さを維持します。

uint16_tを変換するには、htonl()の代わりにhtons()関数を使用する必要があります。htonl()関数は、通常少なくとも4バイトのlongを想定しています。

uint16_t netShort = htons(uint16_t hostShort);

または、構造体の例:

struct.a = htons(struct.a);
struct.b = htons(struct.b); 
于 2012-11-30T01:04:32.283 に答える
0

最初の2つの要素aとbは、uint16_tであるため、htons/ntohsを使用して変換する必要があります。残りの3つの要素c、d、eはuint8_tであり、変換する必要はありません。

ちなみに、変数ad(struct)でntohlを使用するかどうかはわかりませんが、構造体変数全体をntohl / ntohsで変換するのではなく、構造体の各要素を1つずつ変換する必要があることを明確にしてください。 / htonl/htons。

于 2012-11-30T01:09:13.160 に答える