2015-02-06 76 views
0

Python3中是否有字節類型?我只知道有一個字節陣列。Python3字節級別位操作

我想那是什麼,有一個字節0x01,然後再做補運算符~結果將是0xFE,但是當我做下面的步驟,其結果是-2-2不能被添加到字節組。

>>> data=bytearray([0x01]) 
>>> data 
bytearray(b'\x01') 
>>> ~data[0] 
-2 
>>> data[0]=~data[0] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: byte must be in range(0, 256) 

回答

1

Python 3有兩種類型處理字節:bytes類型,這是不可變的(類似於str)和bytearray是可變的。如果您需要將整數轉換爲一個字節,則只需使用& 0xFF即可獲取8個較低位。

所以,你的最後一行應該是:

data[0] = ~ data[0] & 0xFF 
+0

僅僅強調,對於Python 3,按位運算符在「int」類型而不是「字節」上工作。所以'a = b'\ x7f';一個&0xff'將不起作用,而應該是'a = b'\ x7f'[0];一個&0xff' – 2016-11-14 20:58:48

0

您可以~data[0]模256獲得正確移位的值:

>>> data = bytearray([0x01]) 
>>> data[0] = ~data[0]%256 
>>> data 
bytearray(b'\xfe') 

對模操作上負數更多信息,請參閱negative numbers modulo in python

+0

爲什麼不乾脆'〜數據[0] 0xFF'?它保持8個低階位,不存在負模的問題... – 2015-02-06 09:10:09

+0

@SergeBallesta模數的負數已經很好的定義了,爲什麼不呢?它與'&0xFF'一樣,因此沒有什麼可以反對它:) – halex 2015-02-06 10:09:25