Python中整數移位及二進位制串操作

肖老闆發表於2018-08-24

Python中整數移位及二進位制串操作

        最近一個專案涉及到電壓資料的接收和視覺化處理。其中電壓資料是由FPGA通過TCP協議傳輸的二進位制流,軟體接收端需要安裝資料幀格式進行解析後處理。由於嵌入式組的FPGA傳送程式還處於除錯階段,軟體接收端需要先自己寫個TCP Server模擬資料傳送。專案開發語言是Python
以下是資料幀格式的簡單定義:
Alt text
對此資料幀格式的定義其實我個人還是有些看法的!首先是一般資料幀都有header;然後是單通道資料只佔用10bit,但是為了對齊32位補了12個零,有點浪費了。不過這個格式是嵌入式組定義的,也不好說什麼啦 ?

        那麼第一個問題就是在Python中如何將20個bit的兩個通道資料和12個bit的補領拼接在一起,形成一個32位的基本資料單元?搜了一下Python的文件,發現Python對二進位制串處理相當不友好,根本不能進行類似字串拼接這類的操作。一籌莫展之下請教了一下大牛,發現自己對於二進位制位操作是真的一竅不通!計算機組成原理算是白學了:( 下面進入正題,如何從十進位制整數進行位移操作轉換為上面截圖所示的資料幀格式。

        由FPGA傳輸過來的電壓資料是一個無符號整型(實際電壓資料是浮點數,而且有正負,後續還有一個轉換的演算法,這裡不繼續透露了),那麼假設我們有個通道的電壓資料為十進位制整數16,該整數轉換為32位的二進位制數應該是00000000 00000000 00000000 00010000,至於十進位制和二進位制是如何轉換的,如果不會,可以開啟文末的參考網站,上面有提供線上轉換。我們幀格式定義裡面一個通道的資料位是10位,那麼該通道的電壓資料轉為10位二進位制數應該是0000010000。如何將這10位二進位制數和最後我們需要的32位二進位制數拼接起來呢?很簡單,我們只需要進行一次移位操作就可以得到了:將16左移22位即可!移位後的二進位制串為00000100 00000000 00000000 00000000,其對應的十進位制數值為67108864。接下來我們隨機產生第二個通道的資料,假設為十進位制整數12,其對應的32位二進位制數為00000000 00000000 00000000 00001100,問題是如何將12和16在保證順序和值正確的情況下拼接起來呢?對於我們的目標資料,是一個32位的二進位制串,我們的第一個通道資料已經佔據了該二進位制串的前十位,那麼第二個通道的資料應該是從第11位開始。所以第二個通道的資料我們左移位數不是22,而是12。將第二個通道的10bit資料左移12位後得到00000000 00000000 11000000 00000000,其對應的十進位制數為49152。移位後的數值和原始數字完全不一樣了怎麼辦?不要慌,這裡我們暫時不要關心移位後的數值大小。接下來是關鍵的一步:將兩個通道的資料拼接起來。怎麼拼接?直接相加或者做或運算即可!第一個通道移位後的數值67108864加上第二個通道移位後的數值49152後得到67158016,將67158016轉換為32位二進位制串為0000010000 0000001100 000000000000。仔細看,這個32位二進位制串的前十位即為第一個通道的資料0000010000,接下來十位的資料即為第二個通道的資料0000001100,最後十二位即為補的零。是不是很神奇 ?

        接下來將該二進位制串使用socket傳送,然後接收端再進行右移位反序操作即可解出通道的資料,這裡不再繼續下去了。

以下是移位操作的簡單過程

c1 = 16
b_c1 = c1 << 22
c2 = 12
b_c2 = c2 << 12

print(b_c1)
print(b_c2)
print(b_c1 + b_c2)
print(bin(b_c1 + b_c2))

以下是二進位制和整數的相互轉換:

# 整數轉二進位制:
# 1. 採用%2的方式計算
# 2. 採用python自帶了方法 bin.
# 比如bin(10) 回返回字串'0b1010' ,只留下'0','1'序列需要把'0b'去掉.
# bin(number).replace('0b','') 或bin(number)[2:]

>>> bin(10)  # 為了下邊表示方便 放入t中
'0b1010'
 
# 二進位制轉整數:
>>> int(t[2:],2)
10

References:

  1. 線上進位制轉換:http://www.binaryconvert.com/index.html
  2. python二進位制和整數相互轉換:https://blog.csdn.net/a1628864705/article/details/52884441

相關文章