{"id":297627,"date":"2020-01-24T15:00:13","date_gmt":"2020-01-24T15:00:13","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=297627"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=297627","title":{"rendered":"\u041a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 zip-\u0430\u0440\u0445\u0438\u0432 \u0438 \u0447\u0442\u043e \u043c\u044b \u0441 \u044d\u0442\u0438\u043c \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u0427\u0430\u0441\u0442\u044c 4 \u2014 \u0427\u0442\u0435\u043d\u0438\u0435 \u0430\u0440\u0445\u0438\u0432\u0430"},"content":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/485264\/\"><i>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0446\u0438\u043a\u043b\u0430 \u043e Zip-\u0430\u0440\u0445\u0438\u0432\u0430\u0445 \u0438 PHP. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438: <a href=\"https:\/\/habr.com\/ru\/post\/471066\/\">\u0427\u0430\u0441\u0442\u044c 1<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/472966\/\">\u0427\u0430\u0441\u0442\u044c 2<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/484520\/\">\u0427\u0430\u0441\u0442\u044c 3<\/a><\/i> <\/p>\n<p>  \u0414\u043e\u0431\u0440\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0443\u0442\u043e\u043a, \u0434\u043e\u0440\u043e\u0433\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438.<br \/>  \u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0437\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u043e Zip-\u0430\u0440\u0445\u0438\u0432\u0430\u0445 \u0438 PHP.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0430\u0440\u0445\u0438\u0432 \u0438 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u0432\u043e\u0437\u044c\u043c\u0435\u043c <b>photos.zip<\/b> \u0438\u0437 <a href=\"https:\/\/habr.com\/ru\/post\/484520\/\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>. \u0427\u0442\u043e\u0431 \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u2014 <a href=\"https:\/\/github.com\/userqq\/images\/raw\/master\/photos.zip\" rel=\"nofollow\">https:\/\/github.com\/userqq\/images\/raw\/master\/photos.zip<\/a>.<\/p>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430 \u043c\u0438\u043d\u0443\u0442\u043a\u0443 \u043e\u0442\u0432\u043b\u0435\u0447\u0435\u043c\u0441\u044f \u0438 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0438\u0437 \u0447\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043d\u0430\u0448 \u0430\u0440\u0445\u0438\u0432:<br \/>  \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0434\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0451\u043d \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 Local File Header (LFH), \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443 \u043d\u0430\u0441 \u0438\u0434\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 Central Directory File Header (CDFH) \u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e \u043d\u0430\u0448\u0435\u043c\u0443 \u0430\u0440\u0445\u0438\u0432\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438\u0445 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u0430\u0439\u043b\u0430. \u0410 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0430\u0440\u0445\u0438\u0432 End Of Central Directory Record (EOCD) \u2014 \u0442\u0443\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 CDFH, \u0438\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u043e\u0431\u0449\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u0440\u0445\u0438\u0432 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0441 \u043a\u043e\u043d\u0446\u0430, \u0447\u0442\u043e\u0431 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0439\u0442\u0438 EOCD, \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b CDFH \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0430\u0440\u0445\u0438\u0432\u0435.<\/p>\n<p>  <i>FYI: \u0410 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 JPEG, \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0441 \u043d\u0430\u0447\u0430\u043b\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043a\u043b\u0435\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0441 \u0430\u0440\u0445\u0438\u0432\u043e\u043c, \u0434\u0430\u0436\u0435 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 <b>cat image.jpeg archive.zip &gt; imagearchive.jpeg<\/b>, \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430. \u0411\u0440\u0430\u0443\u0437\u0435\u0440\u044b \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0431\u0443\u0434\u0443\u0442 \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443. \u0412 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u043b\u044e\u0431\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f zip-\u0430\u0440\u0445\u0438\u0432\u043e\u0432, \u0431\u0443\u0434\u044c \u0442\u043e 7z \u0438\u043b\u0438 unzip, \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0444\u0430\u0439\u043b\u043e\u043c \u043a\u0430\u043a \u0441 \u0430\u0440\u0445\u0438\u0432\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u2014 <a href=\"https:\/\/github.com\/userqq\/images\/blob\/master\/jpegarchive.jpg\" rel=\"nofollow\">https:\/\/github.com\/userqq\/images\/blob\/master\/jpegarchive.jpg<\/a> (\u041e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e, \u044d\u0442\u0430 \u0448\u0442\u0443\u043a\u0430 \u0432\u0435\u0441\u0438\u0442 \u043e\u043a\u043e\u043b\u043e 20\u043c\u0431, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043e\u0432 \u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0434\u043e\u0440\u043e\u0433 \u0442\u0440\u0430\u0444\u0438\u043a). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0438 \u043d\u0435 \u043e\u0431\u0440\u0435\u0437\u0430\u044e\u0442\u0441\u044f, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043b\u0438\u0432\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438:) \u0425\u043e\u0442\u044f, \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u0430\u043a\u0438\u0445 \u0443\u0436\u0435 \u043d\u0435 \u043d\u0430\u0439\u0442\u0438.<\/i><br \/>  <a name=\"habracut\"><\/a><br \/>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442 \u043d\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 unpack (\u044f \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u044d\u0442\u0443 \u0438\u0434\u0435\u044e \u0443 <a href=\"https:\/\/github.com\/userqq\/images\/blob\/master\/jpegarchive.jpg\" rel=\"nofollow\">clue<\/a> \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 socks \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0438\u0446\u0438\u0444\u0438\u0440\u043e\u0432\u0430\u043b \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f):  <\/p>\n<pre><code class=\"php\">function readBytes($fh, $formatArray) {     \/\/ \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0430\u0442 \u044d\u0442\u0438 \u0431\u0443\u043a\u043e\u0432\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e pack()     \/\/ https:\/\/www.php.net\/manual\/ru\/function.pack.php     \/\/ \u0430 \u0446\u0438\u0444\u0435\u0440\u043a\u0438 \u044d\u0442\u043e \u0434\u043b\u0438\u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0431\u0430\u0439\u0442\u0430\u0445     \/\/ \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, L = unsigned long 32bit = 4 \u0431\u0430\u0439\u0442\u0430     static $lengths = ['L' =&gt; 4, 'l' =&gt; 4, 'i' =&gt; 4, 'I' =&gt; 4, 'S' =&gt; 2, 'a' =&gt; 1];           \/\/ \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b,      \/\/ \u0447\u0442\u043e\u0431 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 fread() \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c.     $totalLength = 0;          \/\/ \u0438 \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u043d\u0430\u0448 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f unpack();     $unpackFormat = [];          \/\/ \u041c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a, \u0447\u0442\u043e \u043c\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0447\u0442\u043e-\u0442\u043e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0434\u043b\u0438\u043d\u0443 0.     \/\/ \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u043b\u0438\u043d\u0430 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f \u0431\u0443\u0434\u0435\u0442 0, \u0430 \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u044d\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c.      \/\/ \u043f\u0443\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430 \u043d\u0430\u0441     $nullData = [];          foreach ($formatArray as $name =&gt; $format) {         $length = 1;         \/\/ \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, ['versionMadeBy' =&gt; 'S'],         \/\/ \u0442\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 SversionMadeBy         \/\/ \u0442\u0430\u043a \u0438 ['filename' =&gt; ['a', $filenameLength]]         \/\/ \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 &quot;a{$filenameLength}filename&quot;         if (is_array($format)) {             [$format, $length] = $format;         }                  \/\/ \u0415\u0441\u043b\u0438 \u0442\u0430\u043a \u0443\u0436 \u0432\u044b\u0448\u043b\u043e, \u0447\u0442\u043e \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e          \/\/ \u0432\u0438\u0434\u0430 ['extraFieldLength' =&gt; ['a', 0]]         \/\/ \u0442\u043e \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0447\u0438\u0442\u0430\u0442\u044c          \/\/ \u0410 \u043f\u043e\u0442\u043e\u043c \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0435\u0440\u043d\u0435\u043c ['extraFieldLength' =&gt; null]         if ($length &lt; 1) {             $nullData[] = $name;             continue;         }                  $totalLength += $lengths[$format] * $length;         $unpackFormat[] = $format . (($length &gt; 1) ? $length : '') . $name;     }          $packet = [];         if ($totalLength &gt; 0) {         $packet = unpack(implode('\/', $unpackFormat), fread($fh, $totalLength));     }          foreach ($nullData as $empty) {         $packet[$empty] = null;     }          return $packet; }<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u0439\u0442\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 EOCD. \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0435\u0451 \u0434\u043b\u0438\u043d\u0430, \u0435\u0441\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439, \u0431\u0443\u0434\u0435\u0442 22 \u0431\u0430\u0439\u0442\u0430, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0435\u0440\u0432\u044b\u0435 4 \u044d\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0441\u043c\u0435\u0449\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e filesize($file) \u2014 22, \u0447\u0438\u0442\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 4 \u0431\u0430\u0439\u0442\u0430 \u0438, \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043f\u043e\u0432\u0435\u0437\u043b\u043e \u0438 \u044d\u0442\u0438 \u0431\u0430\u0439\u0442\u044b \u0440\u0430\u0432\u043d\u044b \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 (0x06054b50), \u0437\u043d\u0430\u0447\u0438\u0442 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043d\u0430\u0448\u0430 EOCD. \u0415\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u0432\u0435\u0437\u043b\u043e \u2014 \u043f\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u043e \u0434\u0432\u0438\u0433\u0430\u0435\u043c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u0444\u0430\u0439\u043b\u0430, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043c \u0438\u043b\u0438 \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u0444\u0430\u0439\u043b \u2014 \u0442\u043e\u0433\u0434\u0430, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u044d\u0442\u043e \u043d\u0435 \u0430\u0440\u0445\u0438\u0432.  <\/p>\n<pre><code class=\"php\">$fh = fopen('photos.zip', 'r');  for ($offset = 22, $length = fstat($fh)['size']; $offset &lt;= $length; $offset++) {     fseek($fh, $offset * -1, SEEK_END);          \/\/ &quot;\\x50\\x4b\\x05\\x06&quot; === pack('L', 0x06054b50), \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 EOCD     if (&quot;\\x50\\x4b\\x05\\x06&quot; === $bytes = fread($fh, 4)) {         echo 'EOCD \u043d\u0430\u0448\u0435\u043b\u0441\u044f \u043d\u0430 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0438 ' . ($length - $offset) . PHP_EOL;         break;     } }  $EOCD = readBytes($fh, [     'diskNumber'                   =&gt; 'S',     'startDiskNumber'              =&gt; 'S',     'numberCentralDirectoryRecord' =&gt; 'S',     'totalCentralDirectoryRecord'  =&gt; 'S',     'sizeOfCentralDirectory'       =&gt; 'L',     'centralDirectoryOffset'       =&gt; 'L',     'commentLength'                =&gt; 'S', ]);  echo '\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0430\u0440\u0445\u0438\u0432\u0435: ' . $EOCD['numberCentralDirectoryRecord'] . PHP_EOL; echo '\u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435 CDFH: ' . $EOCD['centralDirectoryOffset'] . PHP_EOL;<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443 \u043d\u0430\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0430\u0440\u0445\u0438\u0432\u0435 \u0438 \u0433\u0434\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u00ab\u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u00bb \u2014 \u0441\u043f\u0438\u0441\u043e\u043a CDFH \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0445 \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043c\u0435\u043d\u0430, \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0447\u0430\u043b\u0430 LFH \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0430\u0440\u0445\u0438\u0432\u0430.  <\/p>\n<pre><code class=\"php\">echo '\u0421\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0430\u0440\u0445\u0438\u0432\u0435:' . PHP_EOL;  \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0431\u0435\u0433\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 CDFH \u0438 LFH \u0442\u0443\u0434\u0430-\u043e\u0431\u0440\u0430\u0442\u043d\u043e $offset = $EOCD['centralDirectoryOffset']; for ($i = 0; $i &lt; $EOCD['numberCentralDirectoryRecord']; $i++) {     fseek($fh, $offset, SEEK_SET);          \/\/ &quot;\\x50\\x4b\\x01\\x02&quot; === pack('L', 0x02014b50), \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 CDFH     if (&quot;\\x50\\x4b\\x01\\x02&quot; !== $bytes = fread($fh, 4)) {         exit('\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 CDFH' . PHP_EOL);     }          \/\/ \u0447\u0438\u0442\u0430\u0435\u043c CDFH     $CDFH = readBytes($fh, [         'versionMadeBy' =&gt; 'S',         'versionToExtract' =&gt; 'S',         'generalPurposeBitFlag' =&gt; 'S',         'compressionMethod' =&gt; 'S',         'modificationTime' =&gt; 'S',         'modificationDate' =&gt; 'S',         'crc32' =&gt; 'L',         'compressedSize' =&gt; 'L',         'uncompressedSize' =&gt; 'L',         'filenameLength' =&gt; 'S',         'extraFieldLength' =&gt; 'S',         'fileCommentLength' =&gt; 'S',         'diskNumber' =&gt; 'S',         'internalFileAttributes' =&gt; 'S',         'externalFileAttributes' =&gt; 'L',         'localFileHeaderOffset' =&gt; 'L',             ]);     $CDFH += readBytes($fh, [         'filename' =&gt; ['a', $CDFH['filenameLength']],         'extraField' =&gt; ['a', $CDFH['extraFieldLength']],         'fileComment' =&gt; ['a', $CDFH['fileCommentLength']],     ]);          \/\/ \u0417\u0430\u043f\u043e\u043c\u043d\u0438\u043c, \u0433\u0434\u0435 \u0443 \u043d\u0430\u0441 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430\u0441\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 CDFH     $offset = ftell($fh);          \/\/ \u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a LFH     fseek($fh, $CDFH['localFileHeaderOffset'], SEEK_SET);               \/\/ &quot;\\x50\\x4b\\x03\\x04&quot; === pack('L', 0x04034b50), \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 LFH     if (&quot;\\x50\\x4b\\x03\\x04&quot; !== $bytes = fread($fh, 4)) {         exit('\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 LFH' . PHP_EOL);     }          \/\/ \u0427\u0438\u0442\u0430\u0435\u043c LFH     $LFH = readBytes($fh, [         'versionToExtract'      =&gt; 'S',         'generalPurposeBitFlag' =&gt; 'S',         'compressionMethod'     =&gt; 'S',         'modificationTime'      =&gt; 'S',         'modificationDate'      =&gt; 'S',         'crc32'                 =&gt; 'L',         'compressedSize'        =&gt; 'L',         'uncompressedSize'      =&gt; 'L',         'filenameLength'        =&gt; 'S',         'extraFieldLength'      =&gt; 'S',     ]);     $LFH += readBytes($fh, [         'filename'    =&gt; ['a', $LFH['filenameLength']],         'extraField'  =&gt; ['a', $LFH['extraFieldLength']],     ]);          $dataOffset = ftell($fh);          echo '&gt; ' . $CDFH['filename'] . ' ' . $CDFH['compressedSize'] . ' \u0431\u0430\u0439\u0442, ';     echo 'LFH: '  . $CDFH['localFileHeaderOffset'] . ', ';     echo '\u041d\u0430\u0447\u0430\u043b\u043e \u0434\u0430\u043d\u043d\u044b\u0445: '  . $dataOffset . ', ';     echo '\u041a\u043e\u043d\u0435\u0446 \u0434\u0430\u043d\u043d\u044b\u0445: ' . ($dataOffset + $CDFH['compressedSize']);     echo PHP_EOL;      }   fclose($fp);<\/code><\/pre>\n<p>  <i>\u0412\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0433\u0430\u0442\u044c \u043f\u043e \u0444\u0430\u0439\u043b\u0443 \u0442\u0443\u0434\u0430-\u0441\u044e\u0434\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u2014 \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0438\u0434\u0435\u044f \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0431\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043b \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u0432\u0441\u0435 CDFH \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0447\u0442\u0435\u043d\u0438\u044e LFH \u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u043d\u043e \u0443 \u043d\u0430\u0441 \u0442\u0443\u0442 \u00ab\u041d\u0435\u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u00bb, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043c\u043e\u0436\u043d\u043e. <\/i><\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043a\u0440\u0438\u043f\u0442\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"php\">&lt;?php  function readBytes($fh, $formatArray) {     static $lengths = ['L' =&gt; 4, 'l' =&gt; 4, 'i' =&gt; 4, 'I' =&gt; 4, 'S' =&gt; 2, 'a' =&gt; 1];           $totalLength = 0;     $unpackFormat = [];     $nullData = [];          foreach ($formatArray as $name =&gt; $format) {         $length = 1;          if (is_array($format)) {             [$format, $length] = $format;         }                  if ($length &lt; 1) {             $nullData[] = $name;             continue;         }                  $totalLength += $lengths[$format] * $length;         $unpackFormat[] = $format . (($length &gt; 1) ? $length : '') . $name;     }          $packet = [];         if ($totalLength &gt; 0) {         $packet = unpack(implode('\/', $unpackFormat), fread($fh, $totalLength));     }          foreach ($nullData as $empty) {         $packet[$empty] = null;     }          return $packet; }  $fh = fopen('photos.zip', 'r');  for ($offset = 22, $length = fstat($fh)['size']; $offset &lt;= $length; $offset++) {     fseek($fh, $offset * -1, SEEK_END);          if (&quot;\\x50\\x4b\\x05\\x06&quot; === $bytes = fread($fh, 4)) {         echo 'EOCD \u043d\u0430\u0448\u0435\u043b\u0441\u044f \u043d\u0430 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0438 ' . ($length - $offset) . PHP_EOL;         break;     } }  $EOCD = readBytes($fh, [     'diskNumber'                   =&gt; 'S',     'startDiskNumber'              =&gt; 'S',     'numberCentralDirectoryRecord' =&gt; 'S',     'totalCentralDirectoryRecord'  =&gt; 'S',     'sizeOfCentralDirectory'       =&gt; 'L',     'centralDirectoryOffset'       =&gt; 'L',     'commentLength'                =&gt; 'S', ]);  echo '\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0430\u0440\u0445\u0438\u0432\u0435: ' . $EOCD['numberCentralDirectoryRecord'] . PHP_EOL; echo '\u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 CDFH: ' . $EOCD['centralDirectoryOffset'] . PHP_EOL;  echo '\u0421\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0430\u0440\u0445\u0438\u0432\u0435:' . PHP_EOL;  $offset = $EOCD['centralDirectoryOffset']; for ($i = 0; $i &lt; $EOCD['numberCentralDirectoryRecord']; $i++) {     fseek($fh, $offset, SEEK_SET);          if (&quot;\\x50\\x4b\\x01\\x02&quot; !== $bytes = fread($fh, 4)) {         exit('\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 CDFH' . PHP_EOL);     }          $CDFH = readBytes($fh, [         'versionMadeBy' =&gt; 'S',         'versionToExtract' =&gt; 'S',         'generalPurposeBitFlag' =&gt; 'S',         'compressionMethod' =&gt; 'S',         'modificationTime' =&gt; 'S',         'modificationDate' =&gt; 'S',         'crc32' =&gt; 'L',         'compressedSize' =&gt; 'L',         'uncompressedSize' =&gt; 'L',         'filenameLength' =&gt; 'S',         'extraFieldLength' =&gt; 'S',         'fileCommentLength' =&gt; 'S',         'diskNumber' =&gt; 'S',         'internalFileAttributes' =&gt; 'S',         'externalFileAttributes' =&gt; 'L',         'localFileHeaderOffset' =&gt; 'L',             ]);     $CDFH += readBytes($fh, [         'filename' =&gt; ['a', $CDFH['filenameLength']],         'extraField' =&gt; ['a', $CDFH['extraFieldLength']],         'fileComment' =&gt; ['a', $CDFH['fileCommentLength']],     ]);          $offset = ftell($fh);          fseek($fh, $CDFH['localFileHeaderOffset'], SEEK_SET);               if (&quot;\\x50\\x4b\\x03\\x04&quot; !== $bytes = fread($fh, 4)) {         exit('\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 LFH' . PHP_EOL);     }          $LFH = readBytes($fh, [         'versionToExtract'      =&gt; 'S',         'generalPurposeBitFlag' =&gt; 'S',         'compressionMethod'     =&gt; 'S',         'modificationTime'      =&gt; 'S',         'modificationDate'      =&gt; 'S',         'crc32'                 =&gt; 'L',         'compressedSize'        =&gt; 'L',         'uncompressedSize'      =&gt; 'L',         'filenameLength'        =&gt; 'S',         'extraFieldLength'      =&gt; 'S',     ]);     $LFH += readBytes($fh, [         'filename'    =&gt; ['a', $LFH['filenameLength']],         'extraField'  =&gt; ['a', $LFH['extraFieldLength']],     ]);          $dataOffset = ftell($fh);          echo '&gt; ' . $CDFH['filename'] . ' ' . $CDFH['compressedSize'] . ' \u0431\u0430\u0439\u0442, ';     echo 'LFH: '  . $CDFH['localFileHeaderOffset'] . ', ';     echo '\u041d\u0430\u0447\u0430\u043b\u043e \u0434\u0430\u043d\u043d\u044b\u0445: '  . $dataOffset . ', ';     echo '\u041a\u043e\u043d\u0435\u0446 \u0434\u0430\u043d\u043d\u044b\u0445: ' . ($dataOffset + $CDFH['compressedSize']);     echo PHP_EOL;      }  fclose($fh); <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0430\u0440\u0445\u0438\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430:<br \/>  <code>$ php readzip.php<br \/>  EOCD \u043d\u0430\u0448\u0435\u043b\u0441\u044f \u043d\u0430 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0438 18873702<br \/>  \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0430\u0440\u0445\u0438\u0432\u0435: 172<br \/>  \u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435 CDFH: 18864696<br \/>  \u0421\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0430\u0440\u0445\u0438\u0432\u0435:<br \/>  &gt; 0.jpg 135021 \u0431\u0430\u0439\u0442, LFH: 0, \u041d\u0430\u0447\u0430\u043b\u043e \u0434\u0430\u043d\u043d\u044b\u0445: 35, \u041a\u043e\u043d\u0435\u0446 \u0434\u0430\u043d\u043d\u044b\u0445: 135056<br \/>  &gt; 1.jpg 205686 \u0431\u0430\u0439\u0442, LFH: 135056, \u041d\u0430\u0447\u0430\u043b\u043e \u0434\u0430\u043d\u043d\u044b\u0445: 135091, \u041a\u043e\u043d\u0435\u0446 \u0434\u0430\u043d\u043d\u044b\u0445: 340777<br \/>  &gt; 2.jpg 81393 \u0431\u0430\u0439\u0442, LFH: 340777, \u041d\u0430\u0447\u0430\u043b\u043e \u0434\u0430\u043d\u043d\u044b\u0445: 340812, \u041a\u043e\u043d\u0435\u0446 \u0434\u0430\u043d\u043d\u044b\u0445: 422205<br \/>  &gt; 3.jpg 64892 \u0431\u0430\u0439\u0442, LFH: 422205, \u041d\u0430\u0447\u0430\u043b\u043e \u0434\u0430\u043d\u043d\u044b\u0445: 422240, \u041a\u043e\u043d\u0435\u0446 \u0434\u0430\u043d\u043d\u044b\u0445: 487132<br \/>  ...<br \/>  &gt; 171.jpg 50465 \u0431\u0430\u0439\u0442, LFH: 18814194, \u041d\u0430\u0447\u0430\u043b\u043e \u0434\u0430\u043d\u043d\u044b\u0445: 18814231, \u041a\u043e\u043d\u0435\u0446 \u0434\u0430\u043d\u043d\u044b\u0445: 18864696<br \/>  <\/code><\/p>\n<p>  \u0418, \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c \u043c\u044b \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0441\u0435 \u0438\u043b\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0444\u0430\u0439\u043b.<br \/>  \u041c\u044b \u043e\u0431\u043e\u0448\u043b\u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 \u0441\u0436\u0430\u0442\u0438\u0435 \u0441 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u0432 \u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0432 \u0430\u0440\u0445\u0438\u0432\u0435 \u043b\u0435\u0436\u0430\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u044d\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0430 \u0442\u0435\u043c \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u0438\u0442\u044c\u0441\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0441\u0442\u0430\u0442\u0435\u0439 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b.<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u044f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u044b\u043c. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438\u043b\u0438 \u044f \u0432\u0441\u043f\u043e\u043c\u043d\u044e \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0441\u0442\u0430\u0442\u044c\u044f\u043c, \u0442\u043e, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438-\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0417\u0430 \u0441\u0438\u043c \u0432\u0441\u0451. <br \/>  \u0418 \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0432\u0430\u043c \u0445\u043e\u0442\u044c \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435 \u0431\u044b\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e:)<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/485264\/\"> https:\/\/habr.com\/ru\/post\/485264\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/485264\/\"><i>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0446\u0438\u043a\u043b\u0430 \u043e Zip-\u0430\u0440\u0445\u0438\u0432\u0430\u0445 \u0438 PHP. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438: <a href=\"https:\/\/habr.com\/ru\/post\/471066\/\">\u0427\u0430\u0441\u0442\u044c 1<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/472966\/\">\u0427\u0430\u0441\u0442\u044c 2<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/484520\/\">\u0427\u0430\u0441\u0442\u044c 3<\/a><\/i> <\/p>\n<p>  \u0414\u043e\u0431\u0440\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0443\u0442\u043e\u043a, \u0434\u043e\u0440\u043e\u0433\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438.<br \/>  \u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0437\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u043e Zip-\u0430\u0440\u0445\u0438\u0432\u0430\u0445 \u0438 PHP.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0430\u0440\u0445\u0438\u0432 \u0438 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u0432\u043e\u0437\u044c\u043c\u0435\u043c <b>photos.zip<\/b> \u0438\u0437 <a href=\"https:\/\/habr.com\/ru\/post\/484520\/\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>. \u0427\u0442\u043e\u0431 \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u2014 <a href=\"https:\/\/github.com\/userqq\/images\/raw\/master\/photos.zip\" rel=\"nofollow\">https:\/\/github.com\/userqq\/images\/raw\/master\/photos.zip<\/a>.<\/p>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430 \u043c\u0438\u043d\u0443\u0442\u043a\u0443 \u043e\u0442\u0432\u043b\u0435\u0447\u0435\u043c\u0441\u044f \u0438 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0438\u0437 \u0447\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043d\u0430\u0448 \u0430\u0440\u0445\u0438\u0432:<br \/>  \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0434\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0451\u043d \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 Local File Header (LFH), \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443 \u043d\u0430\u0441 \u0438\u0434\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 Central Directory File Header (CDFH) \u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e \u043d\u0430\u0448\u0435\u043c\u0443 \u0430\u0440\u0445\u0438\u0432\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438\u0445 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u0430\u0439\u043b\u0430. \u0410 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0430\u0440\u0445\u0438\u0432 End Of Central Directory Record (EOCD) \u2014 \u0442\u0443\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 CDFH, \u0438\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u043e\u0431\u0449\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u0440\u0445\u0438\u0432 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0441 \u043a\u043e\u043d\u0446\u0430, \u0447\u0442\u043e\u0431 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0439\u0442\u0438 EOCD, \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b CDFH \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0430\u0440\u0445\u0438\u0432\u0435.<\/p>\n<p>  <i>FYI: \u0410 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 JPEG, \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0441 \u043d\u0430\u0447\u0430\u043b\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043a\u043b\u0435\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0441 \u0430\u0440\u0445\u0438\u0432\u043e\u043c, \u0434\u0430\u0436\u0435 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 <b>cat image.jpeg archive.zip &gt; imagearchive.jpeg<\/b>, \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430. \u0411\u0440\u0430\u0443\u0437\u0435\u0440\u044b \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0431\u0443\u0434\u0443\u0442 \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443. \u0412 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u043b\u044e\u0431\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f zip-\u0430\u0440\u0445\u0438\u0432\u043e\u0432, \u0431\u0443\u0434\u044c \u0442\u043e 7z \u0438\u043b\u0438 unzip, \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0444\u0430\u0439\u043b\u043e\u043c \u043a\u0430\u043a \u0441 \u0430\u0440\u0445\u0438\u0432\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u2014 <a href=\"https:\/\/github.com\/userqq\/images\/blob\/master\/jpegarchive.jpg\" rel=\"nofollow\">https:\/\/github.com\/userqq\/images\/blob\/master\/jpegarchive.jpg<\/a> (\u041e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e, \u044d\u0442\u0430 \u0448\u0442\u0443\u043a\u0430 \u0432\u0435\u0441\u0438\u0442 \u043e\u043a\u043e\u043b\u043e 20\u043c\u0431, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043e\u0432 \u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0434\u043e\u0440\u043e\u0433 \u0442\u0440\u0430\u0444\u0438\u043a). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0438 \u043d\u0435 \u043e\u0431\u0440\u0435\u0437\u0430\u044e\u0442\u0441\u044f, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043b\u0438\u0432\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438:) \u0425\u043e\u0442\u044f, \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u0430\u043a\u0438\u0445 \u0443\u0436\u0435 \u043d\u0435 \u043d\u0430\u0439\u0442\u0438.<\/i>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-297627","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/297627","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=297627"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/297627\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=297627"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=297627"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=297627"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}