2016-04-23 61 views
0

我有整數列表,在範圍[0,255]的每個整數。我想把它轉換成一串位。每個整數使用8位來表示。經過我處理的比特串,我想將它轉移到一個整數列表,每8位爲整數。怎麼做?蟒蛇怎麼位的整數列表和字符串之間傳輸?

+0

請顯示你的嘗試[mcve]並解釋你的困難。 – idjaw

+0

你可能會尋找到啓動['B'「演示型」(https://docs.python.org/2/library/string.html#format-string-syntax)在'「」%使用'或'「」.format()'以及[int function的第二種形式](https://docs.python.org/2/library/functions.html#int)一個「基礎」論點。 – jedwards

回答

1

您不需要外部庫。使用python的內置函數。

整數二進制:

i = 100 
print "{0:08b}".format(i) 

二進制整數:

b = "01100100" 
print int(b, 2) 

如果你需要建立一個大型位陣列,然後使用bitarray模塊是好的,因爲你在你的答案做了什麼:

bits = bitarray() 
for i in pixels: bits.extend("{0:08b}".format(i)) 
+0

對不起,我不明確describy我的問題。在轉換成位之後,我會操縱它們。如果使用字符串來表示,它將消耗我所有的記憶。 –

+0

由於python int不是全部4字節,所以我不能使用位偏移來處理像我使用C –

+0

這樣的位。那麼你可以使用'bitarray'作爲你在答案中所做的事情。我也編輯了我的答案。 –

0

我已經得到了答案。這是我的回答:

from PIL import Image 
from bitarray import bitarray 
from bitstring import BitArray 


class Compress: 
    def readFile(self, filename): 
     self.img = Image.open(filename) 
     self.pixels = list(self.img.getdata()) # a list of int--[0,255] 

    def __toBitArray__(self): 
     self.bits = bitarray() 
     for i in self.pixels: 
      self.bits.extend(BitArray(uint=i, length=8).bin) 
     print(self.bits.length()) 

    def saveFile(self, filename): 
     p = [] 
     for i in range(self.bits.length()//8): 
      b = self.bits[i*8:i*8+8].to01() 
     p.append(BitArray(bin=b).uint) 
     self.img.putdata(p) 
     self.img.save(filename) 
     self.img.close() 


if __name__ == '__main__': 
    c = Compress() 
    c.readFile('num.bmp') 
    c.__toBitArray__() 
    c.saveFile('test.bmp')