2013-02-15 33 views
3

我正在使用Arduino,它通過串行(使用pySerial)將一些整數(int)輸出到一個Python腳本,我正在爲Arduino編寫一個與X-Plane(一個飛​​行模擬程序)進行通信的Python腳本。如何在Python中將整數的兩個字節轉換回整數?

我設法將原件分成兩個字節,以便我可以將它發送給腳本,但是我在重構原始整數時遇到了一些問題。我試過使用基本的按位運算符(< <,>>等),就像我在C++程序中所做的那樣,但它似乎不工作。

我懷疑它與數據類型有關。我可能在相同的操作中使用帶有字節的整數,但我無法確切知道每個變量都保持哪種類型,因爲就我所知,我並不真正在Python中聲明變量(我對Python非常陌生) 。

self.pot=self.myline[2]<<8 
self.pot|=self.myline[3] 
+6

你有沒有看過[結構](http://docs.python.org/2/library/struct.html)? – sotapme 2013-02-15 21:45:50

+0

如果您包含示例,它會有所幫助。儘管'struct'模塊很可能會爲你處理它。 – 2013-02-15 21:48:42

回答

-1

要將字節或字符轉換爲其表示的數字,請使用ord()。下面是一個int一個簡單的往返字節和背部:

>>> number = 3**9 
>>> hibyte = chr(number/256) 
>>> lobyte = chr(number % 256) 
>>> hibyte, lobyte 
('L', '\xe3') 
>>> print number == (ord(hibyte) << 8) + ord(lobyte) 
True 

如果您myline變量是字符串或字節串,就可以使用公式中的最後一行上面。如果它以某種方式是一個整數列表,那麼當然你不需要ord

1

你有什麼似乎基本上像它應該工作,假設存儲在myline具有高字節的數據:

myline = [0, 1, 2, 3] 
pot = myline[2]<<8 | myline[3] 

print 'pot: {:d}, 0x{:04x}'.format(pot, pot) # outputs "pot: 515, 0x0203" 

否則,如果它的低字節第一你需要做相反的方式:

myline = [0, 1, 2, 3] 
pot = myline[3]<<8 | myline[2] 

print 'pot: {:d}, 0x{:04x}'.format(pot, pot) # outputs "pot: 770, 0x0302" 
+0

它是高字節優先。儘管如此,這是不可行的。我使用的功能是將數字輸出到需要int,float或double的X-Plane終端(任何都可以)。但是,當我通過self.pot作爲參數(我希望這是正確的術語)時,它不顯示任何內容,而輸出任何其他數字。 – Gepapado 2013-02-15 22:33:07

+0

你用ASCII發送數據到終端的格式是什麼?如果是這樣,那麼在發送它之前如何將'pot'中的值(一個整數)轉換爲該格式? – martineau 2013-02-15 22:53:42

4

可以使用struct模塊整數,表示以字節爲單位之間的轉換。在你的情況下,從一個Python整數轉換爲兩個字節和後面,你會使用:

>>> import struct 
>>> struct.pack('>H', 12345) 
'09' 
>>> struct.unpack('>H', '09') 
(12345,) 

的第一個參數struct.packstruct.unpack表示希望如何被格式化你的數據。在這裏,我通過使用>前綴要求它處於大結局模式(可以使用<作爲小端編碼,或者=作爲本地編碼),然後我說有一個無符號短整型(16位整數)表示由H

其它可能性是b對於一個帶符號字節,用於B一個無符號字節,h對於有符號短(16位),用於i有符號的32位整數,I爲一個無符號的32位整數。您可以通過查看struct模塊的文檔獲取完整列表。

+0

我終於輪到測試它。有效。非常感謝。 – Gepapado 2013-02-23 20:21:06