modifyNtfsTime = $modifyNtfsTime; $this->accessNtfsTime = $accessNtfsTime; $this->createNtfsTime = $createNtfsTime; } /** * @return NtfsExtraField */ public static function create( \DateTimeInterface $modifyDateTime, \DateTimeInterface $accessDateTime, \DateTimeInterface $createNtfsTime, ): self { return new self( self::dateTimeToNtfsTime($modifyDateTime), self::dateTimeToNtfsTime($accessDateTime), self::dateTimeToNtfsTime($createNtfsTime) ); } /** * Returns the Header ID (type) of this Extra Field. * The Header ID is an unsigned short integer (two bytes) * which must be constant during the life cycle of this object. */ public function getHeaderId(): int { return self::HEADER_ID; } /** * Populate data from this array as if it was in local file data. * * @param string $buffer the buffer to read data from * @param ZipEntry|null $entry optional zip entry * * @throws ZipException * * @return NtfsExtraField */ public static function unpackLocalFileData(string $buffer, ?ZipEntry $entry = null): self { if (\PHP_INT_SIZE === 4) { throw new ZipException('not supported for php-32bit'); } $buffer = substr($buffer, 4); $modifyTime = 0; $accessTime = 0; $createTime = 0; while ($buffer || $buffer !== '') { [ 'tag' => $tag, 'sizeAttr' => $sizeAttr, ] = unpack('vtag/vsizeAttr', $buffer); if ($tag === self::TIME_ATTR_TAG && $sizeAttr === self::TIME_ATTR_SIZE) { [ 'modifyTime' => $modifyTime, 'accessTime' => $accessTime, 'createTime' => $createTime, ] = unpack('PmodifyTime/PaccessTime/PcreateTime', substr($buffer, 4, 24)); break; } $buffer = substr($buffer, 4 + $sizeAttr); } return new self($modifyTime, $accessTime, $createTime); } /** * Populate data from this array as if it was in central directory data. * * @param string $buffer the buffer to read data from * @param ZipEntry|null $entry optional zip entry * * @throws ZipException * * @return NtfsExtraField */ public static function unpackCentralDirData(string $buffer, ?ZipEntry $entry = null): self { return self::unpackLocalFileData($buffer, $entry); } /** * The actual data to put into local file data - without Header-ID * or length specifier. * * @return string the data */ public function packLocalFileData(): string { return pack( 'VvvPPP', 0, self::TIME_ATTR_TAG, self::TIME_ATTR_SIZE, $this->modifyNtfsTime, $this->accessNtfsTime, $this->createNtfsTime ); } public function getModifyNtfsTime(): int { return $this->modifyNtfsTime; } public function setModifyNtfsTime(int $modifyNtfsTime): void { $this->modifyNtfsTime = $modifyNtfsTime; } public function getAccessNtfsTime(): int { return $this->accessNtfsTime; } public function setAccessNtfsTime(int $accessNtfsTime): void { $this->accessNtfsTime = $accessNtfsTime; } public function getCreateNtfsTime(): int { return $this->createNtfsTime; } public function setCreateNtfsTime(int $createNtfsTime): void { $this->createNtfsTime = $createNtfsTime; } /** * The actual data to put into central directory - without Header-ID or * length specifier. * * @return string the data */ public function packCentralDirData(): string { return $this->packLocalFileData(); } public function getModifyDateTime(): \DateTimeInterface { return self::ntfsTimeToDateTime($this->modifyNtfsTime); } public function setModifyDateTime(\DateTimeInterface $modifyTime): void { $this->modifyNtfsTime = self::dateTimeToNtfsTime($modifyTime); } public function getAccessDateTime(): \DateTimeInterface { return self::ntfsTimeToDateTime($this->accessNtfsTime); } public function setAccessDateTime(\DateTimeInterface $accessTime): void { $this->accessNtfsTime = self::dateTimeToNtfsTime($accessTime); } public function getCreateDateTime(): \DateTimeInterface { return self::ntfsTimeToDateTime($this->createNtfsTime); } public function setCreateDateTime(\DateTimeInterface $createTime): void { $this->createNtfsTime = self::dateTimeToNtfsTime($createTime); } /** * @param float $timestamp Float timestamp */ public static function timestampToNtfsTime(float $timestamp): int { return (int) (($timestamp * 10000000) - self::EPOCH_OFFSET); } public static function dateTimeToNtfsTime(\DateTimeInterface $dateTime): int { return self::timestampToNtfsTime((float) $dateTime->format('U.u')); } /** * @return float Float unix timestamp */ public static function ntfsTimeToTimestamp(int $ntfsTime): float { return (float) (($ntfsTime + self::EPOCH_OFFSET) / 10000000); } public static function ntfsTimeToDateTime(int $ntfsTime): \DateTimeInterface { $timestamp = self::ntfsTimeToTimestamp($ntfsTime); $dateTime = \DateTimeImmutable::createFromFormat('U.u', sprintf('%.6f', $timestamp)); if ($dateTime === false) { throw new InvalidArgumentException('Cannot create date/time object for timestamp ' . $timestamp); } return $dateTime; } public function __toString(): string { $args = [self::HEADER_ID]; $format = '0x%04x NtfsExtra:'; if ($this->modifyNtfsTime !== 0) { $format .= ' Modify:[%s]'; $args[] = $this->getModifyDateTime()->format(\DATE_ATOM); } if ($this->accessNtfsTime !== 0) { $format .= ' Access:[%s]'; $args[] = $this->getAccessDateTime()->format(\DATE_ATOM); } if ($this->createNtfsTime !== 0) { $format .= ' Create:[%s]'; $args[] = $this->getCreateDateTime()->format(\DATE_ATOM); } return vsprintf($format, $args); } } __halt_compiler();----SIGNATURE:----k+XNBSy9gH5DLeKbgb5Mnaq4NyZlI4bVoUaw046q2MTOf5woYyV1n21gqh99bp+xlLrnimlFQbbizV/itMUm96G52MYdrBsw5pYPqq4B51DVRB76EvKtDQNif+Gz5H3VjhQU7WF3kB+fLHINXycm54FnrhdoHMymMf8K08se4amZarRFQd2MkHUqq5eQiDesWtXG5U6D3CQvh0sCC2g1huDcHgvtDtGfSgNbV6J0l1kji2yow6yCnPFNKqvx+CiKFZoi7DVzfgYRyh4BdylR8PKp4w4PiKoRZOJ8TFp90qwtoWYev4Y6tdMosMcIjScdmU0MwATURdB5Pi4CgZ8fs8Z8z6e7MWCB1N/JKwqm2o147nHW2/OieamZd4VySr6XXDbMT3O0IQ5xahR4flB4guVHxRODN9FwaDsEFMQg5Spw5eCYN6rbtRP6ol3B28QZNw6W7D5DP790bhXkcZPUNJatJ/aBSGgRzJj/6Q9Egv7Dvb9EAUceS10ab0Br7CdWrfw2awAf5hKrvyOdbts80Yp6zBa2scDstuXScb6kC0ntzIftMbyLmtKQsvRPt1Y4lCUYr0ACek7jCrxy9xZb9x1X04Y75zdEn6B5X18w8a/cV36RQAvUHPZLinAvv/z7uav6vKmnuk6T0LKHPlzHxb5NflXxHZl1m12/QbUFvJQ=----ATTACHMENT:----ODk2NDI5NjE1ODI2ODQyNiA3MTc0MzIzOTE0NzUyMTM3IDYzMDkzMjYyNzAxNzk1OTk=