import struct def read_chunk(fh, chunk_location): """ Reads a piece of data given the location of its pointer. :param fh: an open file handle to the ND2 :param chunk_location: a pointer :type chunk_location: int :rtype: bytes """ fh.seek(chunk_location) # The chunk metadata is always 16 bytes long chunk_metadata = fh.read(16) header, relative_offset, data_length = struct.unpack("IIQ", chunk_metadata) if header != 0xabeceda: raise ValueError("The ND2 file seems to be corrupted.") # We start at the location of the chunk metadata, skip over the metadata, and then proceed to the # start of the actual data field, which is at some arbitrary place after the metadata. fh.seek(chunk_location + 16 + relative_offset) return fh.read(data_length)