2014-04-02 72 views
2

我有一個特定大小的字節數組。我想抓住它的最後四個字節,並把它們放在一起,在變量中形成一個四字節的十六進制值。這樣我可以將一個四字節的CRC-32值與我的變量進行比較,並檢查CRC值是否相同。 現在,這是我如何在目前這樣做:我可以通過更好的數組操作來優化此代碼嗎?

static unsigned long whole_four = 0; // This variable holds the last four bytes of the received bytes which are the CRC bytes 

//Note that "MAX_INPUT" is the size of my array and "data" is just a pointer I have used as an argument to a function to point to the elements a buffer array. 

whole_four = ((unsigned long)(*(data+(MAX_INPUT-4)))<< 24) | ((unsigned long)(*(data+(MAX_INPUT-3)))<< 16) | ((unsigned long)(*(data+(MAX_INPUT-2)))<< 8) | ((unsigned long)(*(data+(MAX_INPUT-1)))); 

所以你可以看到我在移動和「或」荷蘭國際集團我的數組的最後四個元素構成一個四個字節變量。 現在,我的問題是: 有沒有更快的方法來實現這一點,並減少所需的處理能力? 我也想提一下,我正在Arduino Uno上編譯此代碼。 任何幫助或提示是非常感謝。

回答

0

如果字節序是不是一個問題(如伊夫說:如果兩個CRC的要比較也能得到相同的方式),你可以嘗試使用:

memcpy(&whole_four, data + MAX_INPUT - 4, sizeof(whole_four)); 

現代編譯考慮到數據類型對齊(字符數組不一定具有正確的對齊方式)/處理器,將內聯該調用以適應您的情況。

PS memcpy將解釋的data與主機系統字節順序(小端)字節,而你的方法從data以big-endian順序解釋字節。

因此,memcpy只有在可以以相同格式獲取其他比較期限時纔有效。

+0

所以爲了澄清,你們認爲可能創建一個循環來使用memcpy將4個CRC字節放在「whole_four」中,比移位和「或」字節更快嗎? – user3397830

+0

我不知道它是否更快,但它很簡單,你可以試試看。編譯器通常會將memcpy與高度優化的特定於平臺的代碼「內聯」。在這種情況下,要在編譯時知道要複製的字節數,編譯器可以將其編譯爲單個加載/存儲。 – manlio

0

*(unsigned long*)(data + MAX_INPUT - 4)將一次取出四個字節。根據印度,這可以給你兩個不同的結果。但是如果兩個CRC的比較都是以同樣的方式獲得的,那沒關係。