2016-11-27 30 views
0

在串行通信中,我需要從蟒發送密文到UART,其能夠通過使用C.如何在C++ python + UART中正確表示單詞?

首先讀取它,在Python側使用這種技術:

ciphertext=(b'\x24\x70\xb4\xc5\x5a\xd8\xcd\xb7\x80\x6a\x7b\x00\x30\x69\xc4\xe0\xd8') 
ser.write(ciphertext) 

在在C端,我把收到的密文放在一個緩衝區中。我測試如果第一個字節24,數據包的開始:

if (buffer_RX[0]=='\x24') 
{ 
    for (i=1;i<=17;i++) //sizeof(buffer_RX)==17 
    { 
     printf("%x \n",buffer_RX[i]); 
    } 
} 
else { 
    printf("It is not a packet!"); 
} 

,我有結果是:

70 
b4 
c5 
5a 

d8 
cd 
b7 
80 

6a 
7b 
0 
30 

69 
c4 
e0 
d8 

所以我有兩個問題, - 拳頭就是爲什麼\x00顯示通過這種方式,我的意思是隻有一個零0? - 第二個是我怎麼能有這種相同的表示:

const unsigned int ciphertext[4] = {0x70b4c55a, 0xd8cdb780, 0x6a7b0030,0x69c4e0d8}; 

如果我想這是一個字節之間串聯,我的意思是也許是:

unsigned int plaintext[1]; 
    plaintext[1]= buffer_RX[3]|buffer_RX[4]|buffer_RX[5]; 

但我不知道,我想我有一個語法錯誤。

這種表示將幫助我繼續下一步。但我不知道我怎麼能請它。

+0

'的printf( 「%02X \ n」,buffer_RX [1]);'會回答你的第一個問題。 – wildplasser

+0

@wildplasser,它糾正我0,但它發送另一個d8最後一個字節分離。 d和8 – nani92

回答

1

如果你想從你的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; 
} 

輸出:

enter image description here

在存儲器:

---------------------------------------------------------------------- 
|  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用武之地。在%02x02告訴你要顯示2個字節不管是什麼printf所以它會在0x00

printf("%02x \n",buffer_RX[i]); 

的情況下打印兩個零。如果你想打印整個32位(4字節)的0x00000070下面一行將做到這一點:

printf("%08x \n",buffer_RX[i]); 
+0

非常感謝您的回答。 – nani92