Python 字節流、字符串、十六進制相互轉換(binascii、bytes)

  • 問題描述

最近做一個項目,是用Python進行相關的串口操作。及將相關指令通過串口發給設備,設備根據發過來的指令來做出相應的操作,所用的庫是Pyserial。在最初開發時,出現的問題在於:別人給的文檔裏面的命令是十六進制的。例如,給出一個指令:

5aa5 07 82 1000 3132 3334  。 那麼,我們需要思考的是,我們如何將上面的指令,轉換爲pyserial庫進行寫操作時(write)所需要的bytes類型。

 

  • 解決方法

首先,我們需要知道的是,我們首先,需要用字符串構造成上面的指令,然後我們將它轉換成bytes。我們可以使用encode()函數將字符串轉爲bytes格式:

 然後我們就可以使用write對串口進行發數據了:

 這裏需要說明的是,我們發送的是字符串的1234,串口那邊就根據ascii進行解析。所以就變成了 31 32 33 34。

 

接下來,再來更換一個場景,我們構造好了一個十六進制的bytes,需要將它還原成字符串:

 

解析串口發過來的數據,首先我們查看從串口發過來的數據格式:

 

 可以看到,我們發送的指令,和收到的指令,看起來不一致,那麼我們也就無法進行調試,也就無法查看發過來的指令是否有錯誤,所以,我們需要對接收到的指令進行轉換。

可以看到,我們通過binascii中的函數,對發送過來的數據進行轉換,轉換成了我們能夠看看懂的命令字符串。 

 

接下來,我們如何將收到的命令,轉換爲文字?例如,我們收到了一串bytes,如果將它轉換爲明文?

 如上圖,我們將收到的bytes已經轉換成了字符串格式,然後將裏面的31 32 33 34提取出來,然後,我們將它們放入一個數組,經過上面的運算以後,我們就得到了明文數據。

 

如何將十六進制轉換爲字節流?

 上述兩個方法均可。

 

  • 總結

由於對上述的知識點不是特別熟悉,所以表述可能有一定的混亂。當初想實現上述幾點功能時也費了很大的勁,所以才寫在這裏供以後後續使用。後來者進行學習時,無需仔細看文字,只需要看圖片,瞭解前後數據類型的轉化成什麼樣,是否符合自己的需求即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章