1class Varbit(object): 2 __slots__ = ('data', 'bits') 3 4 def from_bits(subtype, bits, data): 5 if bits == 1: 6 return (data[0] & (1 << 7)) and OneBit or ZeroBit 7 else: 8 rob = object.__new__(subtype) 9 rob.bits = bits 10 rob.data = data 11 return rob 12 from_bits = classmethod(from_bits) 13 14 def __new__(typ, data): 15 if isinstance(data, Varbit): 16 return data 17 if isinstance(data, bytes): 18 return typ.from_bits(len(data) * 8, data) 19 # str(), eg '00101100' 20 bits = len(data) 21 nbytes, remain = divmod(bits, 8) 22 bdata = [bytes((int(data[x:x+8], 2),)) for x in range(0, bits - remain, 8)] 23 if remain != 0: 24 bdata.append(bytes((int(data[nbytes*8:].ljust(8,'0'), 2),))) 25 return typ.from_bits(bits, b''.join(bdata)) 26 27 def __str__(self): 28 if self.bits: 29 # cut off the remainder from the bits 30 blocks = [bin(x)[2:].rjust(8, '0') for x in self.data] 31 blocks[-1] = blocks[-1][0:(self.bits % 8) or 8] 32 return ''.join(blocks) 33 else: 34 return '' 35 36 def __repr__(self): 37 return '%s.%s(%r)' %( 38 type(self).__module__, 39 type(self).__name__, 40 str(self) 41 ) 42 43 def __eq__(self, ob): 44 if not isinstance(ob, type(self)): 45 ob = type(self)(ob) 46 return ob.bits == self.bits and ob.data == self.data 47 48 def __len__(self): 49 return self.bits 50 51 def __add__(self, ob): 52 return Varbit(str(self) + str(ob)) 53 54 def __mul__(self, ob): 55 return Varbit(str(self) * ob) 56 57 def getbit(self, bitoffset): 58 if bitoffset < 0: 59 idx = self.bits + bitoffset 60 else: 61 idx = bitoffset 62 if not 0 <= idx < self.bits: 63 raise IndexError("bit index %d out of range" %(bitoffset,)) 64 65 byte, bitofbyte = divmod(idx, 8) 66 if ord(self.data[byte]) & (1 << (7 - bitofbyte)): 67 return OneBit 68 else: 69 return ZeroBit 70 71 def __getitem__(self, item): 72 if isinstance(item, slice): 73 return type(self)(str(self)[item]) 74 else: 75 return self.getbit(item) 76 77 def __nonzero__(self): 78 for x in self.data: 79 if x != 0: 80 return True 81 return False 82 83class Bit(Varbit): 84 def __new__(subtype, ob): 85 if ob is ZeroBit or ob is False or ob == '0': 86 return ZeroBit 87 elif ob is OneBit or ob is True or ob == '1': 88 return OneBit 89 90 raise ValueError('unknown bit value %r, 0 or 1' %(ob,)) 91 92 def __nonzero__(self): 93 return self is OneBit 94 95 def __str__(self): 96 return self is OneBit and '1' or '0' 97 98ZeroBit = object.__new__(Bit) 99ZeroBit.data = b'\x00' 100ZeroBit.bits = 1 101OneBit = object.__new__(Bit) 102OneBit.data = b'\x80' 103OneBit.bits = 1 104