2017-04-18 24 views
1

這裏是一小段代碼:不能按位反轉字節組

data = bytearray(file.read(1024)) 
for i in range(0, len(data)): 
    data[i] = ~data[i] 

但由於某些原因,這也不行!我繼續在for循環中獲得ValueError: byte must be in range(0, 256)。我不明白,是不是一個字節仍然是相同大小的字節的位反轉?

我增加了print type(data[i])只是爲了看看發生了什麼,它說intint如何適合python中的字節?

+0

只是想知道,你有沒有打開的文件中二進制格式,就像open('file','rb')一樣。 – JkShaw

+0

是的,它被打開爲二進制文件。我正在使用'r + b'。 – wheeler

回答

0

因爲在字節組的字節是無符號的,按位反轉操作將始終返回負整型,只需添加256(一個字節的最大值),以它:

data = bytearray(file.read(1024)) 
for i in range(0, len(data)): 
    data[i] = ~data[i] + 256 
+0

'因爲bytearray中的字節是無符號的,所以按位反轉運算符總是會返回一個負的int'這只是錯誤的。一個8位無符號字節保存從0到255的值,而一個8位**有符號**字節保存-128到127的值。你的意思是'因爲bytearray中的字節是** signed **'正確的? – wheeler

+0

無論哪種方式它不(或不應該)重要,位是相同的,它只是如何解釋最重要的位。我**應該能夠將字節粘貼在字節數組中,而不管它是否有符號或無符號。爲什麼在python中字節操作非常困難? – wheeler

+0

哦,那不是我的意思,因爲在Python中沒有字節,只有int浮點數,並且它們總是被簽名。我的意思是說,因爲他們總是積極的,他們的反向將永遠是負面的,所以你安全地添加256。 –