2014-03-07 38 views
0

我正在與一個字節尋址的陣列工作ParameterArray [20],其具有不同長度的多個連續的參數:提取特定位

ParameterA: Start = 0; Length = 2 
ParameterB: Start = 2; Length = 1 
ParameterC: Start = 3; Length = 6 
... 

我想建立一個函數,如下所示:

int ExtractedData(startBit, endBit, ParameterStart) 
{ 
    return (ParameterArray[ParameterStart] >> endBit) && 2^startBit; 
} 

上面但是不會工作,如果我超過8位,或例如,如果我想多字節參數的中間位(即比特17:5參數C的)

任何建議關於如何實現這個?

編輯:我修改我的函數如下,但我仍然爲int的大小與此實現限制:

int ExtractedData(startBit, endBit, ParameterStart, parameterLength) 
{ 
    int tempVar = 0; 

    for (int i=0; i < parameterLength; i++) { 
     tempVar = (tempVar << 8 | ParameterArray[ParameterStart+ i]; 
    }  
    return (tempVar >> endBit) & ((1 << (startBit - endBit + 1)) - 1); 
} 

回答

1

兩個失誤,我想。變化:

return (ParameterArray[ParameterStart] >> endBit) && 2^startBit; 

到:

return (ParameterArray[ParameterStart] >> endBit) & ((1 << (endBit - startBit)) - 1); 
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
                |    | 
    need bitwise AND here (not logical AND) --------  need a suitable mask here 

注意^是在C和相關語言的按位異或運算符,它不是一個冪運算符。

+0

我修復了你提到的那兩個錯誤,但是你對如何擴展它來處理多字節參數有什麼建議嗎? – spizzak

+0

需要返回的最大位寬是多少?例如。它總是適合32位int嗎? –

+0

我已經做了修改,以便它能夠處理高達32位的int,但我不確定它的效率。我有時也需要返回多達6個字節,但如果沒有更好的方法來處理它,最終我可以解決這個問題。 – spizzak