0

ポインタと配列を使用することに頭を悩ませています。メソッドと規則に関する簡単な支援が必要です。私はいくつかの同様の投稿を見ましたが、私はまだ非常に文字通りの例が必要な段階にあるのではないかと思います。

UDPパケット内のワードアラインされたデータを表す32ビットの数値の配列があります。ヘッダーチェックサムを計算する場合は16ビットの数値として、データを詰め込む場合は8ビットの数値としてこのデータにアクセスする必要があります。静的に定義されたバッファーがあり、これをルーチンに渡します。

alt_u16 calc_udp_header_chksum (alt_u32 hdr[])
{
....

}
  • ポインタや配列を使用してalt_u16、alt_u8としてこれにアクセスする方法の例を教えてもらえますか?
  • これは、ルーチンにポインターを渡すことで、より明確に記述できるものでしょうか?もしそうなら、例が役立つでしょう。
4

3 に答える 3

1

に単純にキャストできhdrますalt_u16*。このような:

alt_u16* hrd_word_aligned = (alt_u16*)hdr;

hrd_word_aligned[0]これで、最初の 16 ビット値、 2 番目などに使用できますhrd_word_aligned[1]

には類似のコードを使用できますalt_u8*

alt_u32 hdr[]関数が受け取るかどうかは関係ありませんalt_u32 *hdr

于 2012-12-17T14:23:13.710 に答える
0

ダウンキャストは問題ありません。

ポインターを新しい型にキャストするだけです。例えば ​​:

alt_u16* hrd16 = (alt_u16*)hdr;
于 2012-12-17T14:23:56.893 に答える
0

(alt_u32*)からにキャストするだけ(alt_u16*)です。

ただし、エンディアン (バイト順) が結果に影響する場合があります。あなたのバイトオーダーの詳細はわかりません。

コード

alt_u16 calc_udp_header_chksum (alt_u32 hdr[])
{
   int i;
   alt_u16 ans = 0;
   for(i=0; i<correct_size; ++i) {
      ans+=((alt_u16*)hdr)[i];
   }
   return ans;
}
于 2012-12-17T14:24:19.650 に答える