如果你想從你的1字節塊中創建一個4字節長的數據。
const unsigned int ciphertext[4] = {0x70b4c55a, 0xd8cdb780, 0x6a7b0030,0x69c4e0d8};
這是不夠的OR字節,你必須將他們轉移到正確的位置。
目前你正在做什麼,(請注意,您在索引plaintext[1]
這應該是plaintext[0]
):
unsigned int plaintext[1];
plaintext[1]= buffer_RX[3]|buffer_RX[4]|buffer_RX[5];
有這樣的結果在內存中,假設int
爲32位,4字節長:
--------------------------------------------------------------------------------
| 3. byte | 2. byte | 1. byte | 0. byte |
--------------------------------------------------------------------------------
| 0x00 | 0x00 | 0x00 | buffer_RX[3] | buffer_RX[4] | buffer_RX[5] |
--------------------------------------------------------------------------------
因此,您必須將相應的字節移到正確的位置,左移運算符第一個爲<<
,並且OR之後的字節。
下面是一個例子:
#include <stdio.h>
int main()
{
unsigned char buffer_RX[4];
buffer_RX[0] = 0x70;
buffer_RX[1] = 0xb4;
buffer_RX[2] = 0xc5;
buffer_RX[3] = 0x5a;
unsigned int plaintext[1];
plaintext[0] = (buffer_RX[0]<<24) | (buffer_RX[1]<<16) | (buffer_RX[2]<<8) | buffer_RX[3];
printf("plaintext: %08x\n", plaintext[0]);
return 0;
}
輸出:
在存儲器:
----------------------------------------------------------------------
| 3. byte | 2. byte | 1. byte | 0. byte |
----------------------------------------------------------------------
| buffer_RX[0] | buffer_RX[1] | buffer_RX[2] | buffer_RX[3] |
----------------------------------------------------------------------
可以看到,buffer_RX[0]
已轉移通過這是3個字節,所以它跳過前三個單元格,跳到最後一個單元格。
buffer_RX[1]
通過其爲2個字節,所以它跳到前兩個,buffer_RX[2]
通過爲1個字節,所以它跳過第一個。而且buffer_RX[3]
沒有轉移,因爲它走到了第一位。
關於0x00
,它在8位上表示爲零。如果你打印它,那簡直就是。如果您打印0x0000
,它也將是。它只是如何在默認情況下打印,它不會不必要地打印零。如果在0123位變量中有0x70
,那麼它實際上是0x00000070
,但是printf
將會打印0x70
,因爲除非另有說明,否則不必要的零被切斷。這就是%02x
用武之地。在%02x
的02
告訴你要顯示2個字節不管是什麼printf
所以它會在0x00
printf("%02x \n",buffer_RX[i]);
的情況下打印兩個零。如果你想打印整個32位(4字節)的0x00000070
下面一行將做到這一點:
printf("%08x \n",buffer_RX[i]);
'的printf( 「%02X \ n」,buffer_RX [1]);'會回答你的第一個問題。 – wildplasser
@wildplasser,它糾正我0,但它發送另一個d8最後一個字節分離。 d和8 – nani92