2017-05-05 4 views
1

私はVisual StudioのコードでDon JayamanneのPython拡張機能を使って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

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' 

を、私は戻って、それはPython 2.6のために提案されたときにバイトのためにPEPをお読みください。

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

これは明らかに、コンストラクタについては、これを言う:

initializerの引数は、文字列(2.6、strまたはunicodeのいずれか)、の整数、の繰り返し可能性、または単一の整数です。

多分これはPythonのバグです。またはリストと文字列の間にPythonの何かがあります。私はここで紛失しています。

+0

はい、私は誤って3.6と1 2.7 – dumbledad

関連する問題