2016-06-30 139 views
0

一個字節的恭維我的工作在下面的Python代碼:2在蟒蛇

import wave 
from bitstring import BitArray 


w = wave.open('file.wav','rb') 

totalFrames = w.getnframes()  #Total number of samples 
bytesData = w.readframes(totalFrames) 
binData = BitArray(bytesData) 
bin2Data = (binData.bin) 

的file.wav具有44.1KHz的採樣率88200個樣本。 我的目標是能夠獲得2從file.wav獲得的二進制數據的讚美。 'binData.bin'給出了通過w.readframes獲得的字節的二進制形式(\x00\x00N\x00n\xff..),但是以字符串格式。

我是用這個來獲得2'scompliment:

2comp = ~(bin2Data) + 0b1 

但不成功。它會顯示以下錯誤:(。它不會在所有打印出任何東西我猜是因爲數據的大小)

Traceback (most recent call last): 
    File "speaker_bin.py", line 16, in <module> 
    bin2Data = ~((binData.bin)) + 0b1 
TypeError: bad operand type for unary ~: 'str' 

我試圖int(bin2Data)將它轉換,但它不會工作

什麼我做錯了嗎?

我真的很感激任何反饋。 (即使是在正確的方向上簡單的微調)

+1

其他不同的基礎,我認爲'binData.bin'回報一個字符串,所以你可能需要將它轉換爲整數befo重新應用該運營商。像'int(binData.bin,2)' – smac89

+0

相關可能的重複︰http://stackoverflow.com/questions/17067813/convert-ascii-character-to-signed-8-bit-integer-python –

回答

0

您需要使用

int(binData.bin, 2) 

要創建一個int,可以作爲第二個參數指定的基礎上,否則將只是假設值是在基地10.你可以從docs看到,缺省基數是10,這就是爲什麼你需要指定比10

也做同樣的0b1

+0

但沒有' '0b'前綴暗示這是一個二進制數? –

+0

@LPK是的,但int類不想處理傳遞給它的所有字符串變體,因爲這太昂貴了。該字符串可以是基數爲16,24,36等的數字,因此它需要第二個參數來確定您給出的數字的基數。這大大加快了從給定基數轉換數字的過程。並非所有基地都有與其相關的前綴 – smac89

+0

感謝您的及時迴應!但是你不認爲把它轉換成一個'int'會使2的讚美聲明有點浪費嗎?數據將不再是二進制的。 – cr0ssb0w