def readBits(self, address, nbits, endian): assert endian in (BIG_ENDIAN, LITTLE_ENDIAN) shift, data, missing = self.read(address, nbits) if missing: raise ReadStreamError(nbits, address) value = str2long(data, endian) if endian is BIG_ENDIAN: value >>= len(data) * 8 - shift - nbits else: value >>= shift return value & (1 << nbits) - 1
def readBits(self, address, nbits, endian): assert endian in (BIG_ENDIAN, LITTLE_ENDIAN, MIDDLE_ENDIAN) if endian is MIDDLE_ENDIAN: # read an aligned chunk of words wordaddr, remainder = divmod(address, 16) wordnbits = alignValue(remainder+nbits, 16) _, data, missing = self.read(wordaddr*16, wordnbits) shift = remainder else: shift, data, missing = self.read(address, nbits) if missing: raise ReadStreamError(nbits, address) value = str2long(data, endian) if endian in (BIG_ENDIAN, MIDDLE_ENDIAN): value >>= len(data) * 8 - shift - nbits else: value >>= shift return value & (1 << nbits) - 1
def readBits(self, address, nbits, endian): assert endian in (BIG_ENDIAN, LITTLE_ENDIAN, MIDDLE_ENDIAN) if endian is MIDDLE_ENDIAN: # read an aligned chunk of words wordaddr, remainder = divmod(address, 16) wordnbits = alignValue(remainder + nbits, 16) _, data, missing = self.read(wordaddr * 16, wordnbits) shift = remainder else: shift, data, missing = self.read(address, nbits) if missing: raise ReadStreamError(nbits, address) value = str2long(data, endian) if endian in (BIG_ENDIAN, MIDDLE_ENDIAN): value >>= len(data) * 8 - shift - nbits else: value >>= shift return value & (1 << nbits) - 1
def fixPNG(data): # array -> str data = data.tostring() origdata = data datalen = len(data) data = StringIO(data) data.seek(0) data.write("\x89PNG\r\n\x1a\n") index = 8 while index < (datalen-4): data.seek(index) size = str2long(data.read(4), BIG_ENDIAN) chunksize = size+12 if datalen < (index+chunksize): info("fixPNG: Skip invalid chunk at %s" % index) break crcofs = index+chunksize-4 data.seek(crcofs) oldcrc = data.read(4) data.seek(index+4) o = data.tell() crcdata = data.read(chunksize-8) newcrc = long2raw(pngCRC32(crcdata), BIG_ENDIAN, 4) data.seek(index+chunksize-4) data.write(newcrc) index += chunksize data.seek(0,0) data = data.read() assert len(data) == len(origdata) # str -> array data = array('B', data) return data