2012-12-01 166 views
1

我正在使用示波器組件讀取傳感器數據。我將這些數據發送到將數據發送到筆記本電腦的基站mote。TinyOS:如何將uint_16轉換爲兩個uint_8整數(AES加密)

我想要實現使用這裏提供的組件的傳感器數據的AES加密:http://tinyos.cvs.sourceforge.net/viewvc/tinyos/tinyos-2.x-contrib/crypto/index.html

我的計劃是從10的數據緩衝器減少到8中Oscilloscope.h。這將總數據大小更改爲128位(與AES中的塊大小相同)。現在唯一的問題是AES塊中的每個數組元素是一個unit_8,但是數據緩衝區的數組元素是uint_16。

無論如何,我可以''拆分'uint_16值的上限和下限位?然後我將它們作爲2個元素存儲在我的AES塊數組中。

爲了澄清,我有一個uint_16,它對應於傳感器讀取的一些數據。我希望能夠以2 uint_8的值存儲此值。然後,我將加密數據塊,將數據包發送到基站,基站將解密這些數據並將其與原始uint_16組合。

回答

3

當然,不僅僅是最小顯著八位存儲在一個變量,而在其他

unit8_t low = value & 0xFF; 
uint8_t high = (value >> 8) & 0xFF; 

(按位最顯著八,因爲指定了轉換uint8_t做的是在這兩種情況下是多餘的一樣)。

爲了取回部分uint16_t值,你需要一個轉變,按位或,

uint16_t reassembled = ((uint16_t)high << 8) | low; 

由於整數促銷的移位運算的參數執行,投給uint16_t是沒有必要的如果int大於16位寬,但是如果int正好是16位寬,則該移位可能導致未定義的行爲,因爲high*256值不需要表示爲int,因此爲了安全起見,在移位之前需要強制轉換。如果int是16位寬,則從演員獲得的uint16_t然後將轉換爲unsigned int - 除非您有一個不正常的實現,其中unsigned int的寬度小於int的寬度 - 否則爲int,但那足夠寬。

+0

好吧,我會給這個鏡頭。謝謝。 – user1754045

+0

爲了將它們結合起來,我只需要逆轉操作?我會做一個左高位,然後按位和兩個值? – user1754045

+0

@ user1754045按住Shift或Shift鍵,或看到更新。 –