2009-04-17 46 views
-1

我有这个语法的一些问题。有人可以向我解释这个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; 
} 

谢谢!

+0

讲述的是C语法这一问题或protodec_henten的目的()? – Tom 2009-04-17 14:47:30

+0

“解释代码” -questions是一般的“笨”,因此,我们不知道,如果他想知道的功能是什么,按位或,或对函数的结果。 – 2009-04-17 14:49:52

+5

没有示例调用就很难确定函数的用途。它可以用于不同的目的(一些深奥的,其他的很简单),这取决于帧的内容。 – Pesto 2009-04-17 14:50:39

回答

15

我猜你是指以下行作为具有混淆语法的行。

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

允许打破这

  • 帧[从+ 1]:“从”表示初始索引到阵列,i是简单地将当前偏移。因此,这是从索引“from”开始有效地迭代阵列。
  • size - 1 - i:这是计算要移位的位数,并基于当前索引进行。该数字将从-1开始并随着循环的进行而减少
  • (frame [from + i] < <(size-1-i):这会将值从+ i移位指定的位数
  • TPM | = ...:DOS按位或表达式上仍然可用一次迭代值已转移字节
0

看起来像散列函数。 第二个想到这会造成一个很差的散列函数。

他们正在移动每个帧的大小的其余部分,然后将其与静态值进行或。这个值然后返回。

0

我想你不明白tmp |=,因为这可能是代码中“难以理解”的唯一部分。如果您尝试搜索C运营商,您会发现一个列表here,现在|=表示“按位或”,您可以阅读更多关于它们的信息here

所以这段代码真正做的是需要一些输入,你告诉函数从“缓冲区”/“框架”开始读取的位置,并且按照“大小”参数的说明按位或按位置。

7

其他已经描述过的每一行,所以我就添加什么功能。 确实是。您可以想象在位置(from)和(from+size)之间的frame中位于不同位置的“堆栈”中的字节。 st字节将被放置在左边。

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

现在,如果任何字节“below”在相关位置设置了一个位,tmp就会置位。

0

由于逐位OR,这个功能才有意义,如果在frame所有值都是0或1。

在这种情况下,它将把的frame连续size值(即比特)开始于索引from成一个unsigned long。最后一位(索引from+size-1)将作为最低有效位插入。

-3

该整体代码只是将一个范围的数据复制到tmp变量中。实际上,它只是简单地做一个memcpy。

为什么不只是做:的memcpy(& TMP,框+从,大小)

2

看起来有点打包机。如果像埃里克建议,在frame所有字符或者是0或1,那么这将size人物和包装其价值的tmp。例如,如果frame(在偏移start)包含值00 01 00 00 01 01 01 00,然后protodec_henten(0,8,frame)将返回(省略前导零)0x4E(或以二进制01001110)。有更好的方法来做到这一点,所以它可能正在做其他事情,但很难说清楚。

相关问题