コード例 #1
0
    def getExtraField(self):
        if self.getExtraFieldLDLength() == 0:
            return None
        #Handler for case where offset cannot be found in central Directory
        if self.zip64Flag["offsetZip64"]:
            #If Offset flag present use central directory to find offset in extrafield
            startPosition = (46 + self.getFileNameLength())
            extraField = self.centralDirectory[startPosition:(
                startPosition + self.getExtraFieldCDLength())]

            efParser = extra_field_parse.HeaderIdMapping()
            efMappings = efParser.HeaderIds()

            start = extraField.find("\x01\x00")
            blockMagic = extraField[start:start + 2]
            blockSize = struct.unpack("<H", extraField[start + 2:start + 4])[0]
            parser = efMappings[blockMagic]["parseField"]()
            zip64 = parser.parse(efBlock, self.zip64Flag)
            offset = zip64["RelativeOffset"]

            startPosition = (offset + 30 + self.getFileNameLength())
            extraField = self.localDirectory[startPosition:(
                startPosition + self.getExtraFieldLDLength())]
        else:
            startPosition = (self.getRelativeOffset() + 30 +
                             self.getFileNameLength())
            extraField = self.localDirectory[startPosition:(
                startPosition + self.getExtraFieldLDLength())]
        return self.parseExtraField(extraField)
コード例 #2
0
 def parseExtraField(self, extraField):
     parsedExtraField = []
     efParser = extra_field_parse.HeaderIdMapping()
     efMappings = efParser.HeaderIds()
     while extraField:
         blockMagic = extraField[0:2]
         blockSize = struct.unpack("<H", extraField[2:4])[0]
         efBlock = extraField[:4 + blockSize]
         if blockMagic in efMappings.keys():
             #Mapping Header Is known (may or may not have been parsed)
             parser = efMappings[blockMagic]["parseField"]()
             parsedExtraField.append(parser.parse(efBlock, self.zip64Flag))
         else:
             #No Header Hits
             parser = efMappings["Unknown"]["parseField"]()
             parsedExtraField.append(parser.parse(efBlock, self.zip64Flag))
         extraField = extraField[4 + blockSize:]
     return parsedExtraField