我的语法有些问题。有人可以向我解释这个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;
}
谢谢!
答案 0 :(得分:15)
我猜测你将以下行称为具有混乱语法的行。
tmp |= (frame[from + i]) << (size - 1 - i);
让我们打破这个
答案 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)