python 如何在整数列表和位串之间传递?
python how to transfer between a list of integers and string of bits?
我有一个整数列表,每个整数都在 [0,255] 范围内。我想把它转换成一串比特。每个整数用8位来表示。处理完一串比特后,我想将其转换为一个整数列表,每 8 位转换为一个整数。怎么做?
我得到了答案。这是我的回答:
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')
您不需要外部库。使用 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,255] 范围内。我想把它转换成一串比特。每个整数用8位来表示。处理完一串比特后,我想将其转换为一个整数列表,每 8 位转换为一个整数。怎么做?
我得到了答案。这是我的回答:
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')
您不需要外部库。使用 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))