0

私は本業の C 開発者ではありません... 実を言うと、私は本業の開発者ではないので、使用している用語が間違っている可能性があります。

私はこの 1 時間ほど、defineステートメントについて、次にpointer参照について読んでいて、次の例にかなり混乱しています。

与えられた:

#define get_u_int16_t (X,O)  (*(u_int16_t *)(((u_int8_t *)X) + O))

if (get_u_int16_t(packet->payload, 0) == htons(0x0004)) {
//do something
return;
}

get_u_int16_t(packet->payload, 0)これは、 がポインターによって参照されるデータpacket->payloadを 8 ビット セクションに分割し、最初の 8 ビットを返すことを意味します+ 0か?

これは、予約しようとしている nDPI ライブラリの afp.c の一部からの例です

[ノート]

htons()は、word(16 ビット) をホスト バイト オーダー (ほとんどのマシンではリトル エンディアン、ビッグ エンディアン マシンではビッグ エンディアン) で取り、それをwordネットワーク バイト オーダー (常にビッグ エンディアン) に変換する関数です。この場合、(AndreyT に感謝します!)のwordat offset 0 はビッグ エンディアンで a を返すため、ntop 開発者は指定された値 (この場合、フローがApple Filing Protocol) は、ネットワーク スタックのビッグ エンディアンに対してリトル エンディアンです。packet->payloadwordhtons()

[もっと]

いくつかの質問を、あいまいな質問をしやすいフォーラムに移動して、将来同様の状況に対処する人々に役立つ可能性のある技術を理解してもらいました。

4

1 に答える 1

2

あなたは正しいですが、完全ではありません。

u_int8_tタイプは、アドレス指定単位として機能します。基本的には「バイト」です。だから、

((u_int8_t *)X) + O)

Opartは、 が指すメモリ ブロックの先頭からbyte-offset の位置を選択するだけXです。それが型の役割がu_int8_t終わるところです。

次に、*(u_int16_t *)デバイスはそのメモリ位置を符号なし 16 ビット ワードとして解釈します。

これで、マクロが address に格納された 16 ビット値 (8 ビット値ではない) を「返す」ことを除いて、すべてが正しくなりましたX + O0特定の例では、マクロを使用して、メモリ block の最初 (offset) に格納されている符号なし 16 ビット値を読み取りますpacket->payload

この方法で書かれたマクロは左辺値に評価されることに注意してください。つまり、指定されたメモリ ブロックの特定のバイト オフセットで 16 ビット データを書き込むためにも使用できます。

get_u_int16_t(packet->payload, 0) = 42;

42メモリ ブロック の先頭にある 16 ビット ワードに書き込みますpacket->payload

于 2013-07-12T16:40:27.343 に答える