有人可以解释这个C函数吗?

时间:2009-04-17 14:43:15

标签: c

我的语法有些问题。有人可以向我解释这个C函数在做什么吗?

unsigned long protodec_henten(int from, int size, unsigned char *frame)
{
   int i = 0;
   unsigned long tmp = 0;

   for (i = 0; i < size; i++)
     tmp |= (frame[from + i]) << (size - 1 - i);

   return tmp;
}

谢谢!

7 个答案:

答案 0 :(得分:15)

我猜测你将以下行称为具有混乱语法的行。

tmp |= (frame[from + i]) << (size - 1 - i);

让我们打破这个

  • frame [from + i]:“from”表示数组的初始索引,i只是当前的偏移量。所以这有效地从索引“from”
  • 开始迭代数组
  • size - 1 - i:这是根据当前索引计算要移位的位数,并且正在这样做。此数字将从大小-1开始,并随着循环的进行而减少
  • (frame [from + i]&lt;&lt;(size - 1 - i):这会将值从+ i移位指定的位数
  • tpm | = ...:在迭代值移位后仍然可用的字节上的按位或表达式。

答案 1 :(得分:7)

其他人已经描述过每一行,所以我只想添加所做的功能。你可以想象frame中位置(from)和(from+size)之间位于不同位置的“堆栈”上的字节。第一个字节将放在左侧。

bits from:      tmp: |    +  +     |(LSB-side of tmp)
frame[from]:           ---+----
frame[from+1]:          -----+--
frame[from+2]:           -+------
...

现在,如果“下方”中的任何字节在相关位置设置了位,则tmp会置位。

答案 2 :(得分:2)

看起来像一个小包装工。如果像Eric建议的那样,frame中的所有字符都是0或1,那么这将占用size个字符并将其值打包到tmp。例如,如果frame(偏移start)包含值00 01 00 00 01 01 01 00,则protodec_henten(0,8,frame)将返回(省略前导零)0x4E(或二进制01001110 )。有更好的方法可以做到这一点,所以它可能正在做其他事情,但很难说清楚。

答案 3 :(得分:0)

看起来像一个散列函数。第二个想到这会产生一个非常糟糕的散列函数。

它们将每个帧移动大小的剩余部分,然后使用静态值对其进行OR运算。然后返回此值。

答案 4 :(得分:0)

我猜你不理解tmp |=,因为这可能是代码中唯一难以理解的部分。如果您尝试搜索C运算符,则会找到列表here,现在|=表示“按位或”,您可以阅读有关它们here的更多信息。

所以这段代码真正做的是它需要一些输入,你告诉功能从“缓冲区”/“框架”开始读取的位置,你可以像“大小”参数那样按位或按位。

答案 5 :(得分:0)

由于按位OR,只有当frame中的所有值都为0或1时,此函数才有意义。

在这种情况下,它会将从size开始的frame的{​​{1}}个连续值(即位)放入单个from。最后一位(索引unsigned long)将作为最低有效位插入。

答案 6 :(得分:-3)

这个整体代码只是将一系列数据复制到tmp变量中。事实上,它只是简单地做了一个memcpy。

为什么不这样做:memcpy(&amp; tmp,frame + from,size)