0

我正在努力思考如何使用指针和数组。我需要一些关于方法和约定的简单帮助。我确实看到了一些类似的帖子,但恐怕我仍然需要非常具体的例子。

我有一个 32 位数字数组,代表 UDP 数据包中的字对齐数据。我需要将这些数据作为 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 位值,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 回答