1. 程式人生 > 程式設計 >Python 位元組流,字串,十六進位制相互轉換例項(binascii,bytes)

Python 位元組流,字串,十六進位制相互轉換例項(binascii,bytes)

問題描述

最近做一個專案,是用Python進行相關的串列埠操作。及將相關指令通過串列埠發給裝置,裝置根據發過來的指令來做出相應的操作,所用的庫是Pyserial。在最初開發時,出現的問題在於:別人給的文件裡面的命令是十六進位制的。例如,給出一個指令:

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

解決方法

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

Python 位元組流,字串,十六進位制相互轉換例項(binascii,bytes)

然後我們就可以使用write對串列埠進行發資料了:

Python 位元組流,bytes)

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

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

Python 位元組流,bytes)

解析串列埠發過來的資料,首先我們檢視從串列埠發過來的資料格式:

Python 位元組流,bytes)

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

Python 位元組流,bytes)

可以看到,我們通過binascii中的函式,對傳送過來的資料進行轉換,轉換成了我們能夠看看懂的命令字串。

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

Python 位元組流,bytes)

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

如何將十六進位制轉換為位元組流?

Python 位元組流,bytes)

上述兩個方法均可。

總結

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

補充知識:python中字元之間的轉換函式

int(x [,base ]) 將x轉換為一個整數

long(x [,base ]) 將x轉換為一個長整數

base預設引數值為10,也就是說把字串'x'視為十進位制數轉換成十進位制數

print int('12345',8) # 5349

float(x ) 將x轉換到一個浮點數
complex(real [,imag ]) 建立一個複數
str(x ) 將物件 x 轉換為字串
repr(x ) 將物件 x 轉換為表示式字串
eval(str ) 用來計算在字串中的有效Python表示式,並返回一個物件
tuple(s ) 將序列 s 轉換為一個元組
list(s ) 將序列 s 轉換為一個列表
chr(x ) 將一個整數轉換為一個字元
unichr(x ) 將一個整數轉換為Unicode字元
ord(x ) 將一個字元轉換為它的整數值
hex(x ) 將一個整數轉換為一個十六進位制字串
oct(x ) 將一個整數轉換為一個八進位制字串

以上這篇Python 位元組流,bytes)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。