2009-04-17 88 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)。有更好的方法來做到這一點,所以它可能正在做其他事情,但很難說清楚。

相關問題