C 与其他大小一样访问32位字数组

C 与其他大小一样访问32位字数组,c,arrays,pointers,casting,C,Arrays,Pointers,Casting,我正努力用指针和数组来改变我的想法。我需要一些关于方法和约定的简单帮助。我确实看到过一些类似的帖子,但恐怕我仍然需要一些非常文字化的例子 我有一个32位数字数组,表示UDP数据包中的字对齐数据。我需要以16位数字的形式访问这些数据,以计算报头校验和,并在填充数据时以8位数字的形式访问这些数据。我有一个静态定义的缓冲区,作为 alt_u16 calc_udp_header_chksum (alt_u32 hdr[]) { .... } 有没有人能帮我举一些例子,说明如何以alt_u16的形式

我正努力用指针和数组来改变我的想法。我需要一些关于方法和约定的简单帮助。我确实看到过一些类似的帖子,但恐怕我仍然需要一些非常文字化的例子

我有一个32位数字数组,表示UDP数据包中的字对齐数据。我需要以16位数字的形式访问这些数据,以计算报头校验和,并在填充数据时以8位数字的形式访问这些数据。我有一个静态定义的缓冲区,作为

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

}
  • 有没有人能帮我举一些例子,说明如何以alt_u16的形式访问此文件, alt_u8是否使用指针和或数组
  • 这是不是 将指针传递到例程中会更清晰吗?如果 因此,举个例子会很有帮助

您可以简单地将
hdr
转换为
alt\u u16*
。像这样:

alt_u16* hrd_word_aligned = (alt_u16*)hdr;
现在您可以对第一个16位值使用
hrd\u单词对齐[0]
,对第二个16位值使用
hrd\u单词对齐[1]
,依此类推

分析代码可用于
alt\u u8*


您的函数是否接收到
alt_u32 hdr[]
alt_u32*hdr

向下转换不是问题

您只需要将指针强制转换为新类型。例如:

alt_u16* hrd16 = (alt_u16*)hdr;
只需从
(alt_u32*)
转换为
(alt_u16*)

但是endianness(字节顺序)可能会影响结果。我不知道你的字节顺序的细节

代码

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;
}
alt_u16计算udp_头chksum(alt_u32 hdr[])
{
int i;
alt_u16 ans=0;

对于(i=0;i
我确实看到过一些类似的帖子
如此?看起来像是一个只有一篇帖子的新帐户。如果你用不同的用户名在上面发了其他帖子,可能会链接到它们,持续的混乱是什么。谢谢你的帮助。我让它工作起来了。顺便说一句:你说的endian是个问题是对的。以太网是big endian,但我的处理器很少e-endian。大多数web引用都说chksum覆盖了ip报头,但没有确切描述报头的哪一部分被覆盖。显示了校验和覆盖的报头部分。谢谢。顺便说一句:确实出现了endian问题;我的处理器是little endian,ethernet是big endian。此外,大多数引用都说UDP报头校验和覆盖IP报头,但没有明确说明覆盖了哪些字节。显示了使用了哪些字节,并给出了一个具体示例。使用
ntohs
将网络字节顺序转换为主机字节顺序。如果考虑主机和网络字节顺序,而不是小字节和大字节顺序,请尝试养成习惯。