2017-05-05 14 views
1

我使用Don Jayamanne的Python擴展在Visual Studio代碼中開發Windows上的Python腳本。這是我的「手錶」調試窗口的內容:爲什麼Python的'len'函數誇大了一個字節數組的長度?

VSCode screenshot

字節數組someBytes是20的長度,但Python的len函數使得77.爲什麼呢?

陣列被這樣產生的:

def sendTouchDown(ble): 
    message = bytes([0x01, 0x68, 0x03, 0x39, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]) 
    if ble: 
     sendMuxBle(message) 
    else: 
     sendMuxRfcomm(message) 

然後其長度如此測量:

def sendMuxRfcomm(someBytes): 
    crc = 0xFFFF 
    for i in range(0, len(someBytes), 2): 
+5

因爲'someBytes'是字節數組的字符串表示形式。 – vaultah

+1

'someBytes [0] ='['''毫無疑問... –

+1

這將解釋爲什麼我的代碼會變得瘋狂! – dumbledad

回答

1

這聽起來像的Python 2中的那些怪異的東西這是固定在一個Python 3.

The bytes構造函數w生病將任何非字符串傳遞給它並將其轉換爲字符串。因此,你的說法在邏輯上是相同的:

thelist = [0x01, 0x68, 0x03, 0x39, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF] 
message = bytes(str(thelist)) 

創建文字這樣,而不是一個字節:

message = b'\x01\x68\x03\x39\x05\x01\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF' 

我回去,並讀取字節的PEP時,有人提議爲Python 2.6:

https://www.python.org/dev/peps/pep-0358/

它清楚地表示,這對構造:

初始化參數可以是一個字符串(在2.6中,str或unicode),一個可迭代的整數或一個整數。

也許這是Python中的一個錯誤。或者在列表和字符串之間存在一些Pythonic,我在這裏錯過了。

+0

是的 - 我無意中在一臺3.6和一臺開發機器之間交換在2.7上 – dumbledad

相關問題