1
1
mirror of https://github.com/wader/fq.git synced 2024-09-17 14:57:09 +03:00

zip: Add format decoder

This commit is contained in:
Mattias Wadman 2021-11-01 13:08:52 +01:00
parent 5344c7e3de
commit d838d2f613
19 changed files with 1789 additions and 186 deletions

View File

@ -82,6 +82,7 @@
"mfhd",
"mfra",
"mfro",
"mitchellh",
"MJPEG",
"moof",
"moov",

View File

@ -59,7 +59,7 @@ cp fq /usr/local/bin
[./formats_list.jq]: sh-start
aac_frame, adts, adts_frame, apev2, av1_ccr, av1_frame, av1_obu, avc_annexb, avc_au, avc_dcr, avc_nalu, avc_pps, avc_sei, avc_sps, bzip2, dns, elf, exif, flac, flac_frame, flac_metadatablock, flac_metadatablocks, flac_picture, flac_streaminfo, gif, gzip, hevc_annexb, hevc_au, hevc_dcr, hevc_nalu, icc_profile, id3v1, id3v11, id3v2, jpeg, json, matroska, mp3, mp3_frame, mp4, mpeg_asc, mpeg_es, mpeg_pes, mpeg_pes_packet, mpeg_spu, mpeg_ts, ogg, ogg_page, opus_packet, png, protobuf, protobuf_widevine, pssh_playready, raw, tar, tiff, vorbis_comment, vorbis_packet, vp8_frame, vp9_cfm, vp9_frame, vpx_ccr, wav, webp, xing
aac_frame, adts, adts_frame, apev2, av1_ccr, av1_frame, av1_obu, avc_annexb, avc_au, avc_dcr, avc_nalu, avc_pps, avc_sei, avc_sps, bzip2, dns, elf, exif, flac, flac_frame, flac_metadatablock, flac_metadatablocks, flac_picture, flac_streaminfo, gif, gzip, hevc_annexb, hevc_au, hevc_dcr, hevc_nalu, icc_profile, id3v1, id3v11, id3v2, jpeg, json, matroska, mp3, mp3_frame, mp4, mpeg_asc, mpeg_es, mpeg_pes, mpeg_pes_packet, mpeg_spu, mpeg_ts, ogg, ogg_page, opus_packet, png, protobuf, protobuf_widevine, pssh_playready, raw, tar, tiff, vorbis_comment, vorbis_packet, vp8_frame, vp9_cfm, vp9_frame, vpx_ccr, wav, webp, xing, zip
[#]: sh-end

View File

@ -69,8 +69,9 @@
|`wav` |WAV&nbsp;file |<sub>`id3v2` `id3v1` `id3v11`</sub>|
|`webp` |WebP&nbsp;image |<sub>`vp8_frame`</sub>|
|`xing` |Xing&nbsp;header |<sub></sub>|
|`zip` |ZIP&nbsp;archive |<sub>`probe`</sub>|
|`image` |Group |<sub>`gif` `jpeg` `mp4` `png` `tiff` `webp`</sub>|
|`probe` |Group |<sub>`adts` `bzip2` `elf` `flac` `gif` `gzip` `jpeg` `json` `matroska` `mp3` `mp4` `mpeg_ts` `ogg` `png` `tar` `tiff` `wav` `webp`</sub>|
|`probe` |Group |<sub>`adts` `bzip2` `elf` `flac` `gif` `gzip` `jpeg` `json` `matroska` `mp3` `mp4` `mpeg_ts` `ogg` `png` `tar` `tiff` `wav` `webp` `zip`</sub>|
[#]: sh-end

View File

@ -75,7 +75,7 @@
<text text-anchor="start" x="2608" y="-293.3" font-family="Times,serif" font-size="14.00">icc_profile</text>
</g>
<!-- image&#45;&gt;jpeg -->
<g id="edge102" class="edge">
<g id="edge103" class="edge">
<title>image&#45;&gt;jpeg:jpeg</title>
<path fill="none" stroke="black" d="M2448.3,-851.91C2449.89,-770.34 2458.29,-422.94 2487,-385 2514.75,-348.33 2542.86,-369.55 2584,-349 2591.29,-345.36 2593.21,-339.78 2598.12,-337.08"/>
<polygon fill="black" stroke="black" points="2598.73,-339.45 2605,-335.5 2597.63,-334.68 2598.73,-339.45"/>
@ -129,10 +129,10 @@
<text text-anchor="start" x="1611" y="-394.8" font-family="Times,serif" font-size="14.00">vpx_ccr</text>
</g>
<!-- image&#45;&gt;mp4 -->
<g id="edge107" class="edge">
<g id="edge108" class="edge">
<title>image&#45;&gt;mp4:mp4</title>
<path fill="none" stroke="black" d="M2420.72,-866.3C2298.2,-854.2 1802.03,-805.16 1736.22,-798.7"/>
<polygon fill="black" stroke="black" points="1736.2,-796.24 1729,-798 1735.73,-801.12 1736.2,-796.24"/>
<path fill="none" stroke="black" d="M2420.92,-866.46C2336.54,-858.52 2070.89,-833.4 1851,-811 1799.19,-805.72 1784.8,-798.67 1736.11,-798.04"/>
<polygon fill="black" stroke="black" points="1736.02,-795.59 1729,-798 1735.98,-800.49 1736.02,-795.59"/>
</g>
<!-- png -->
<g id="node56" class="node">
@ -145,7 +145,7 @@
<text text-anchor="start" x="2506" y="-574.8" font-family="Times,serif" font-size="14.00">exif</text>
</g>
<!-- image&#45;&gt;png -->
<g id="edge111" class="edge">
<g id="edge112" class="edge">
<title>image&#45;&gt;png:png</title>
<path fill="none" stroke="black" d="M2458.97,-851.87C2481.94,-814.35 2533.2,-721.27 2535.89,-634.07"/>
<polygon fill="black" stroke="black" points="2538.34,-634.04 2536,-627 2533.44,-633.96 2538.34,-634.04"/>
@ -159,7 +159,7 @@
<text text-anchor="start" x="2714" y="-584.8" font-family="Times,serif" font-size="14.00">icc_profile</text>
</g>
<!-- image&#45;&gt;tiff -->
<g id="edge114" class="edge">
<g id="edge115" class="edge">
<title>image&#45;&gt;tiff:tiff</title>
<path fill="none" stroke="black" d="M2475.28,-869.53C2519.73,-868.85 2607.74,-860.79 2657,-811 2720.87,-746.45 2623.26,-615.42 2703.78,-608.3"/>
<polygon fill="black" stroke="black" points="2704.11,-610.74 2711,-608 2703.9,-605.84 2704.11,-610.74"/>
@ -173,19 +173,19 @@
<text text-anchor="start" x="664" y="-584.8" font-family="Times,serif" font-size="14.00">vp8_frame</text>
</g>
<!-- image&#45;&gt;webp -->
<g id="edge117" class="edge">
<g id="edge118" class="edge">
<title>image&#45;&gt;webp:webp</title>
<path fill="none" stroke="black" d="M2420.64,-866.36C2372.18,-861.78 2268.07,-852.33 2180,-847 1975.11,-834.6 1458.06,-852.32 1257,-811 1012.74,-760.8 980.44,-610.96 735.31,-608.04"/>
<path fill="none" stroke="black" d="M2420.8,-866.49C2371.05,-861.97 2262.07,-852.46 2170,-847 1967.31,-834.99 1455.88,-851.92 1257,-811 1012.75,-760.75 980.44,-610.96 735.31,-608.04"/>
<polygon fill="black" stroke="black" points="735.01,-605.59 728,-608 734.99,-610.49 735.01,-605.59"/>
</g>
<!-- gif -->
<g id="node63" class="node">
<g id="node64" class="node">
<title>gif</title>
<polygon fill="paleturquoise" stroke="transparent" points="2611,-588.5 2611,-607.5 2631,-607.5 2631,-588.5 2611,-588.5"/>
<text text-anchor="start" x="2613" y="-593.8" font-family="Times,serif" font-size="14.00">gif</text>
</g>
<!-- image&#45;&gt;gif -->
<g id="edge99" class="edge">
<g id="edge100" class="edge">
<title>image&#45;&gt;gif:gif</title>
<path fill="none" stroke="black" d="M2475.06,-865.37C2506.59,-859.64 2557.85,-845.35 2585,-811 2631.9,-751.67 2627.25,-653.64 2623.16,-614.7"/>
<polygon fill="black" stroke="black" points="2625.55,-614 2622.32,-607.32 2620.68,-614.55 2625.55,-614"/>
@ -311,25 +311,25 @@
<!-- probe -->
<g id="node16" class="node">
<title>probe</title>
<path fill="palegreen" stroke="palegreen" d="M2246,-1511.5C2246,-1511.5 2276,-1511.5 2276,-1511.5 2282,-1511.5 2288,-1517.5 2288,-1523.5 2288,-1523.5 2288,-1535.5 2288,-1535.5 2288,-1541.5 2282,-1547.5 2276,-1547.5 2276,-1547.5 2246,-1547.5 2246,-1547.5 2240,-1547.5 2234,-1541.5 2234,-1535.5 2234,-1535.5 2234,-1523.5 2234,-1523.5 2234,-1517.5 2240,-1511.5 2246,-1511.5"/>
<text text-anchor="middle" x="2261" y="-1525.8" font-family="Times,serif" font-size="14.00">probe</text>
<path fill="palegreen" stroke="palegreen" d="M2350,-1511.5C2350,-1511.5 2380,-1511.5 2380,-1511.5 2386,-1511.5 2392,-1517.5 2392,-1523.5 2392,-1523.5 2392,-1535.5 2392,-1535.5 2392,-1541.5 2386,-1547.5 2380,-1547.5 2380,-1547.5 2350,-1547.5 2350,-1547.5 2344,-1547.5 2338,-1541.5 2338,-1535.5 2338,-1535.5 2338,-1523.5 2338,-1523.5 2338,-1517.5 2344,-1511.5 2350,-1511.5"/>
<text text-anchor="middle" x="2365" y="-1525.8" font-family="Times,serif" font-size="14.00">probe</text>
</g>
<!-- bzip2&#45;&gt;probe -->
<g id="edge11" class="edge">
<title>bzip2:probe&#45;&gt;probe</title>
<path fill="none" stroke="black" d="M461,-1404C493.45,-1404 452.83,-1454.52 478,-1475 548.4,-1532.27 1985.26,-1529.51 2226.71,-1528.64"/>
<polygon fill="black" stroke="black" points="2226.83,-1531.09 2233.82,-1528.62 2226.82,-1526.19 2226.83,-1531.09"/>
<path fill="none" stroke="black" d="M461,-1404C493.45,-1404 452.81,-1454.55 478,-1475 552.75,-1535.7 2081.11,-1530.04 2330.68,-1528.7"/>
<polygon fill="black" stroke="black" points="2330.7,-1531.15 2337.69,-1528.67 2330.67,-1526.25 2330.7,-1531.15"/>
</g>
<!-- probe&#45;&gt;adts -->
<g id="edge94" class="edge">
<g id="edge95" class="edge">
<title>probe&#45;&gt;adts:adts</title>
<path fill="none" stroke="black" d="M2233.87,-1528.47C2023.28,-1528.12 655.66,-1523.97 585,-1475 567.37,-1462.78 583.28,-1432.9 571.11,-1425.62"/>
<polygon fill="black" stroke="black" points="571.37,-1423.16 564,-1424 570.28,-1427.94 571.37,-1423.16"/>
<path fill="none" stroke="black" d="M2337.94,-1528.52C2120.23,-1528.59 660.29,-1527.07 585,-1475 567.36,-1462.8 583.28,-1432.9 571.11,-1425.62"/>
<polygon fill="black" stroke="black" points="571.37,-1423.17 564,-1424 570.28,-1427.94 571.37,-1423.17"/>
</g>
<!-- probe&#45;&gt;bzip2 -->
<g id="edge95" class="edge">
<g id="edge96" class="edge">
<title>probe&#45;&gt;bzip2:bzip2</title>
<path fill="none" stroke="black" d="M2233.87,-1528.57C2015.54,-1528.98 551.58,-1529.73 478,-1475 461.38,-1462.63 478.77,-1433.36 468.1,-1425.81"/>
<path fill="none" stroke="black" d="M2337.73,-1528.61C2111.78,-1529.43 556.08,-1532.97 478,-1475 461.36,-1462.65 478.76,-1433.37 468.1,-1425.81"/>
<polygon fill="black" stroke="black" points="468.39,-1423.35 461,-1424 467.18,-1428.1 468.39,-1423.35"/>
</g>
<!-- flac -->
@ -343,31 +343,31 @@
<text text-anchor="start" x="1276" y="-574.8" font-family="Times,serif" font-size="14.00">flac_frame</text>
</g>
<!-- probe&#45;&gt;flac -->
<g id="edge97" class="edge">
<g id="edge98" class="edge">
<title>probe&#45;&gt;flac:flac</title>
<path fill="none" stroke="black" d="M1948,-1413C1919.14,-1398.91 1956.56,-1154.95 1948,-1124"/>
<path fill="none" stroke="black" d="M1669,-869C1641.58,-836.08 1624.48,-838.94 1592,-811 1502.3,-733.84 1515.9,-625.96 1408,-617.53"/>
<path fill="none" stroke="black" d="M1981,-1122C1926.4,-952.61 1786.62,-1004.56 1669,-871"/>
<path fill="none" stroke="black" d="M1981,-1413C1951.63,-1400.03 1990.85,-1154.56 1981,-1124"/>
<path fill="none" stroke="black" d="M1669,-869C1640.68,-836.85 1624.48,-838.94 1592,-811 1502.3,-733.84 1515.9,-625.96 1408,-617.53"/>
<polygon fill="black" stroke="black" points="1407.84,-615.06 1400.71,-617.12 1407.56,-619.96 1407.84,-615.06"/>
<path fill="none" stroke="black" d="M1948,-1122C1903.55,-961.24 1775.74,-999.17 1669,-871"/>
</g>
<!-- gzip -->
<g id="node24" class="node">
<title>gzip</title>
<polygon fill="paleturquoise" stroke="transparent" points="1875,-1395 1875,-1433 1911,-1433 1911,-1395 1875,-1395"/>
<text text-anchor="start" x="1880.5" y="-1419.8" font-family="Times,serif" font-size="14.00">gzip</text>
<polygon fill="lightgrey" stroke="transparent" points="1875,-1395 1875,-1414 1911,-1414 1911,-1395 1875,-1395"/>
<text text-anchor="start" x="1877" y="-1400.8" font-family="Times,serif" font-size="14.00">probe</text>
<polygon fill="paleturquoise" stroke="transparent" points="1908,-1395 1908,-1433 1944,-1433 1944,-1395 1908,-1395"/>
<text text-anchor="start" x="1913.5" y="-1419.8" font-family="Times,serif" font-size="14.00">gzip</text>
<polygon fill="lightgrey" stroke="transparent" points="1908,-1395 1908,-1414 1944,-1414 1944,-1395 1908,-1395"/>
<text text-anchor="start" x="1910" y="-1400.8" font-family="Times,serif" font-size="14.00">probe</text>
</g>
<!-- probe&#45;&gt;gzip -->
<g id="edge100" class="edge">
<g id="edge101" class="edge">
<title>probe&#45;&gt;gzip:gzip</title>
<path fill="none" stroke="black" d="M2233.8,-1527.35C2163.98,-1523.89 1980.7,-1511.46 1934,-1475 1916.82,-1461.59 1932.07,-1432.11 1918.89,-1425.38"/>
<polygon fill="black" stroke="black" points="1919.35,-1422.98 1912,-1424 1918.38,-1427.78 1919.35,-1422.98"/>
<path fill="none" stroke="black" d="M2337.86,-1528.24C2257.98,-1526.96 2025.62,-1519.43 1967,-1475 1949.63,-1461.84 1965.02,-1432.17 1951.88,-1425.39"/>
<polygon fill="black" stroke="black" points="1952.35,-1422.99 1945,-1424 1951.37,-1427.79 1952.35,-1422.99"/>
</g>
<!-- probe&#45;&gt;jpeg -->
<g id="edge101" class="edge">
<g id="edge102" class="edge">
<title>probe&#45;&gt;jpeg:jpeg</title>
<path fill="none" stroke="black" d="M2621,-869C2623.46,-838.76 2648.68,-840.18 2657,-811 2708.91,-628.92 2699.09,-569.6 2657,-385 2653.63,-370.24 2644.02,-366.33 2639.91,-356.18"/>
<path fill="none" stroke="black" d="M2621,-869C2624.53,-838.87 2648.68,-840.18 2657,-811 2708.91,-628.92 2699.09,-569.6 2657,-385 2653.63,-370.24 2644.02,-366.33 2639.91,-356.18"/>
<polygon fill="black" stroke="black" points="2642.28,-355.55 2638.21,-349.35 2637.52,-356.73 2642.28,-355.55"/>
</g>
<!-- matroska -->
@ -415,156 +415,170 @@
<text text-anchor="start" x="952" y="-938.8" font-family="Times,serif" font-size="14.00">vp9_frame</text>
</g>
<!-- probe&#45;&gt;matroska -->
<g id="edge104" class="edge">
<g id="edge105" class="edge">
<title>probe&#45;&gt;matroska:matroska</title>
<path fill="none" stroke="black" d="M2233.83,-1520.79C2178.54,-1504.63 2049.55,-1464.58 1948,-1415"/>
<path fill="none" stroke="black" d="M1948,-1413C1922.86,-1400.73 1951.09,-1370.16 1929,-1353 1893.29,-1325.25 1199.12,-1306.15 1083.85,-1304.17"/>
<polygon fill="black" stroke="black" points="1083.6,-1301.72 1076.56,-1304.06 1083.52,-1306.62 1083.6,-1301.72"/>
<path fill="none" stroke="black" d="M2337.62,-1522.95C2273.46,-1509.41 2109.14,-1471.59 1981,-1415"/>
<path fill="none" stroke="black" d="M1981,-1413C1955.41,-1401.7 1984.11,-1370.14 1962,-1353 1924.82,-1324.17 1201.17,-1305.97 1083.66,-1304.15"/>
<polygon fill="black" stroke="black" points="1083.57,-1301.7 1076.54,-1304.05 1083.5,-1306.6 1083.57,-1301.7"/>
</g>
<!-- mp3 -->
<g id="node44" class="node">
<title>mp3</title>
<polygon fill="paleturquoise" stroke="transparent" points="2270.5,-1357 2270.5,-1471 2339.5,-1471 2339.5,-1357 2270.5,-1357"/>
<text text-anchor="start" x="2293" y="-1457.8" font-family="Times,serif" font-size="14.00">mp3</text>
<polygon fill="lightgrey" stroke="transparent" points="2271,-1433 2271,-1452 2340,-1452 2340,-1433 2271,-1433"/>
<text text-anchor="start" x="2273" y="-1438.8" font-family="Times,serif" font-size="14.00">id3v2</text>
<polygon fill="lightgrey" stroke="transparent" points="2271,-1414 2271,-1433 2340,-1433 2340,-1414 2271,-1414"/>
<text text-anchor="start" x="2273" y="-1419.8" font-family="Times,serif" font-size="14.00">id3v1</text>
<polygon fill="lightgrey" stroke="transparent" points="2271,-1395 2271,-1414 2340,-1414 2340,-1395 2271,-1395"/>
<text text-anchor="start" x="2273" y="-1400.8" font-family="Times,serif" font-size="14.00">id3v11</text>
<polygon fill="lightgrey" stroke="transparent" points="2271,-1376 2271,-1395 2340,-1395 2340,-1376 2271,-1376"/>
<text text-anchor="start" x="2273" y="-1381.8" font-family="Times,serif" font-size="14.00">apev2</text>
<polygon fill="lightgrey" stroke="transparent" points="2271,-1357 2271,-1376 2340,-1376 2340,-1357 2271,-1357"/>
<text text-anchor="start" x="2273" y="-1362.8" font-family="Times,serif" font-size="14.00">mp3_frame</text>
<polygon fill="paleturquoise" stroke="transparent" points="2286.5,-1357 2286.5,-1471 2355.5,-1471 2355.5,-1357 2286.5,-1357"/>
<text text-anchor="start" x="2309" y="-1457.8" font-family="Times,serif" font-size="14.00">mp3</text>
<polygon fill="lightgrey" stroke="transparent" points="2287,-1433 2287,-1452 2356,-1452 2356,-1433 2287,-1433"/>
<text text-anchor="start" x="2289" y="-1438.8" font-family="Times,serif" font-size="14.00">id3v2</text>
<polygon fill="lightgrey" stroke="transparent" points="2287,-1414 2287,-1433 2356,-1433 2356,-1414 2287,-1414"/>
<text text-anchor="start" x="2289" y="-1419.8" font-family="Times,serif" font-size="14.00">id3v1</text>
<polygon fill="lightgrey" stroke="transparent" points="2287,-1395 2287,-1414 2356,-1414 2356,-1395 2287,-1395"/>
<text text-anchor="start" x="2289" y="-1400.8" font-family="Times,serif" font-size="14.00">id3v11</text>
<polygon fill="lightgrey" stroke="transparent" points="2287,-1376 2287,-1395 2356,-1395 2356,-1376 2287,-1376"/>
<text text-anchor="start" x="2289" y="-1381.8" font-family="Times,serif" font-size="14.00">apev2</text>
<polygon fill="lightgrey" stroke="transparent" points="2287,-1357 2287,-1376 2356,-1376 2356,-1357 2287,-1357"/>
<text text-anchor="start" x="2289" y="-1362.8" font-family="Times,serif" font-size="14.00">mp3_frame</text>
</g>
<!-- probe&#45;&gt;mp3 -->
<g id="edge105" class="edge">
<g id="edge106" class="edge">
<title>probe&#45;&gt;mp3:mp3</title>
<path fill="none" stroke="black" d="M2256.73,-1511.37C2253.31,-1494.44 2250.86,-1470.15 2262.88,-1463.65"/>
<polygon fill="black" stroke="black" points="2263.73,-1465.97 2270,-1462 2262.63,-1461.19 2263.73,-1465.97"/>
<path fill="none" stroke="black" d="M2369.52,-1511.37C2373.18,-1494.44 2375.99,-1470.15 2364.09,-1463.65"/>
<polygon fill="black" stroke="black" points="2364.37,-1461.2 2357,-1462 2363.26,-1465.97 2364.37,-1461.2"/>
</g>
<!-- probe&#45;&gt;mp4 -->
<g id="edge106" class="edge">
<g id="edge107" class="edge">
<title>probe&#45;&gt;mp4:mp4</title>
<path fill="none" stroke="black" d="M1669,-869C1653.96,-850.94 1665,-838.72 1668.2,-818.12"/>
<polygon fill="black" stroke="black" points="1670.64,-818.33 1668.92,-811.11 1665.77,-817.83 1670.64,-818.33"/>
<path fill="none" stroke="black" d="M1669,-869C1653.46,-851.36 1664.87,-838.83 1668.18,-818.14"/>
<polygon fill="black" stroke="black" points="1670.62,-818.34 1668.92,-811.12 1665.75,-817.82 1670.62,-818.34"/>
</g>
<!-- ogg -->
<g id="node54" class="node">
<title>ogg</title>
<polygon fill="paleturquoise" stroke="transparent" points="1877.5,-531.5 1877.5,-664.5 1990.5,-664.5 1990.5,-531.5 1877.5,-531.5"/>
<text text-anchor="start" x="1924" y="-650.8" font-family="Times,serif" font-size="14.00">ogg</text>
<polygon fill="lightgrey" stroke="transparent" points="1878,-626 1878,-645 1991,-645 1991,-626 1878,-626"/>
<text text-anchor="start" x="1880" y="-631.8" font-family="Times,serif" font-size="14.00">ogg_page</text>
<polygon fill="lightgrey" stroke="transparent" points="1878,-607 1878,-626 1991,-626 1991,-607 1878,-607"/>
<text text-anchor="start" x="1880" y="-612.8" font-family="Times,serif" font-size="14.00">vorbis_packet</text>
<polygon fill="lightgrey" stroke="transparent" points="1878,-588 1878,-607 1991,-607 1991,-588 1878,-588"/>
<text text-anchor="start" x="1880" y="-593.8" font-family="Times,serif" font-size="14.00">vorbis_comment</text>
<polygon fill="lightgrey" stroke="transparent" points="1878,-569 1878,-588 1991,-588 1991,-569 1878,-569"/>
<text text-anchor="start" x="1880" y="-574.8" font-family="Times,serif" font-size="14.00">opus_packet</text>
<polygon fill="lightgrey" stroke="transparent" points="1878,-550 1878,-569 1991,-569 1991,-550 1878,-550"/>
<text text-anchor="start" x="1880" y="-555.8" font-family="Times,serif" font-size="14.00">flac_metadatablock</text>
<polygon fill="lightgrey" stroke="transparent" points="1878,-531 1878,-550 1991,-550 1991,-531 1878,-531"/>
<text text-anchor="start" x="1880" y="-536.8" font-family="Times,serif" font-size="14.00">flac_frame</text>
<polygon fill="paleturquoise" stroke="transparent" points="1867.5,-531.5 1867.5,-664.5 1980.5,-664.5 1980.5,-531.5 1867.5,-531.5"/>
<text text-anchor="start" x="1914" y="-650.8" font-family="Times,serif" font-size="14.00">ogg</text>
<polygon fill="lightgrey" stroke="transparent" points="1868,-626 1868,-645 1981,-645 1981,-626 1868,-626"/>
<text text-anchor="start" x="1870" y="-631.8" font-family="Times,serif" font-size="14.00">ogg_page</text>
<polygon fill="lightgrey" stroke="transparent" points="1868,-607 1868,-626 1981,-626 1981,-607 1868,-607"/>
<text text-anchor="start" x="1870" y="-612.8" font-family="Times,serif" font-size="14.00">vorbis_packet</text>
<polygon fill="lightgrey" stroke="transparent" points="1868,-588 1868,-607 1981,-607 1981,-588 1868,-588"/>
<text text-anchor="start" x="1870" y="-593.8" font-family="Times,serif" font-size="14.00">vorbis_comment</text>
<polygon fill="lightgrey" stroke="transparent" points="1868,-569 1868,-588 1981,-588 1981,-569 1868,-569"/>
<text text-anchor="start" x="1870" y="-574.8" font-family="Times,serif" font-size="14.00">opus_packet</text>
<polygon fill="lightgrey" stroke="transparent" points="1868,-550 1868,-569 1981,-569 1981,-550 1868,-550"/>
<text text-anchor="start" x="1870" y="-555.8" font-family="Times,serif" font-size="14.00">flac_metadatablock</text>
<polygon fill="lightgrey" stroke="transparent" points="1868,-531 1868,-550 1981,-550 1981,-531 1868,-531"/>
<text text-anchor="start" x="1870" y="-536.8" font-family="Times,serif" font-size="14.00">flac_frame</text>
</g>
<!-- probe&#45;&gt;ogg -->
<g id="edge109" class="edge">
<g id="edge110" class="edge">
<title>probe&#45;&gt;ogg:ogg</title>
<path fill="none" stroke="black" d="M1948,-1122C1898.26,-928.76 1933.67,-870.29 1934.96,-675.83"/>
<polygon fill="black" stroke="black" points="1937.42,-675.57 1935,-668.56 1932.52,-675.55 1937.42,-675.57"/>
<path fill="none" stroke="black" d="M1981,-1122C1926.16,-928.58 1925.02,-871.62 1925,-675.61"/>
<polygon fill="black" stroke="black" points="1927.45,-675.58 1925,-668.58 1922.55,-675.58 1927.45,-675.58"/>
</g>
<!-- probe&#45;&gt;png -->
<g id="edge110" class="edge">
<g id="edge111" class="edge">
<title>probe&#45;&gt;png:png</title>
<path fill="none" stroke="black" d="M2288.29,-1514.59C2291.2,-1513.3 2294.14,-1512.08 2297,-1511 2353.92,-1489.61 2384.43,-1516.37 2429,-1475 2494.35,-1414.34 2605.58,-1165.64 2621,-871"/>
<path fill="none" stroke="black" d="M2621,-869C2623.46,-838.76 2597.03,-838.85 2585,-811 2552.92,-736.77 2537.41,-713.67 2536.09,-637.93"/>
<path fill="none" stroke="black" d="M2392.21,-1513.05C2412.44,-1501.08 2437.74,-1484.91 2445,-1475 2455.33,-1460.9 2619.35,-888.4 2621,-871"/>
<path fill="none" stroke="black" d="M2621,-869C2624.53,-838.87 2597.03,-838.85 2585,-811 2552.92,-736.77 2537.41,-713.67 2536.09,-637.93"/>
<polygon fill="black" stroke="black" points="2538.54,-637.89 2536.01,-630.92 2533.64,-637.95 2538.54,-637.89"/>
</g>
<!-- tar -->
<g id="node58" class="node">
<title>tar</title>
<polygon fill="paleturquoise" stroke="transparent" points="2375,-1395 2375,-1433 2411,-1433 2411,-1395 2375,-1395"/>
<text text-anchor="start" x="2385.5" y="-1419.8" font-family="Times,serif" font-size="14.00">tar</text>
<polygon fill="lightgrey" stroke="transparent" points="2375,-1395 2375,-1414 2411,-1414 2411,-1395 2375,-1395"/>
<text text-anchor="start" x="2377" y="-1400.8" font-family="Times,serif" font-size="14.00">probe</text>
<polygon fill="paleturquoise" stroke="transparent" points="2391,-1395 2391,-1433 2427,-1433 2427,-1395 2391,-1395"/>
<text text-anchor="start" x="2401.5" y="-1419.8" font-family="Times,serif" font-size="14.00">tar</text>
<polygon fill="lightgrey" stroke="transparent" points="2391,-1395 2391,-1414 2427,-1414 2427,-1395 2391,-1395"/>
<text text-anchor="start" x="2393" y="-1400.8" font-family="Times,serif" font-size="14.00">probe</text>
</g>
<!-- probe&#45;&gt;tar -->
<g id="edge112" class="edge">
<g id="edge113" class="edge">
<title>probe&#45;&gt;tar:tar</title>
<path fill="none" stroke="black" d="M2288.33,-1514.56C2314.94,-1500.79 2352.07,-1480.95 2357,-1475 2370.34,-1458.9 2355.06,-1431.93 2367.04,-1425.44"/>
<polygon fill="black" stroke="black" points="2367.64,-1427.81 2374,-1424 2366.65,-1423.01 2367.64,-1427.81"/>
<path fill="none" stroke="black" d="M2378.44,-1511.49C2390.32,-1494.86 2406.14,-1468.17 2408.66,-1441.22"/>
<polygon fill="black" stroke="black" points="2411.11,-1441.11 2409,-1434 2406.22,-1440.88 2411.11,-1441.11"/>
</g>
<!-- probe&#45;&gt;tiff -->
<g id="edge113" class="edge">
<g id="edge114" class="edge">
<title>probe&#45;&gt;tiff:tiff</title>
<path fill="none" stroke="black" d="M2288.13,-1514.1C2291.07,-1512.91 2294.06,-1511.84 2297,-1511 2370.69,-1489.93 2585.37,-1528.75 2640,-1475 2673.05,-1442.48 2739.4,-716.63 2743.77,-625.13"/>
<polygon fill="black" stroke="black" points="2746.23,-625.07 2744,-618 2741.33,-624.92 2746.23,-625.07"/>
<path fill="none" stroke="black" d="M2392.17,-1514.26C2395.1,-1513.03 2398.08,-1511.92 2401,-1511 2499.3,-1480.14 2558.02,-1548.71 2630,-1475 2695.67,-1407.75 2741.98,-743.52 2743.94,-625"/>
<polygon fill="black" stroke="black" points="2746.39,-625.02 2744,-618 2741.49,-624.98 2746.39,-625.02"/>
</g>
<!-- wav -->
<g id="node60" class="node">
<title>wav</title>
<polygon fill="paleturquoise" stroke="transparent" points="2193.5,-1376 2193.5,-1452 2236.5,-1452 2236.5,-1376 2193.5,-1376"/>
<text text-anchor="start" x="2203.5" y="-1438.8" font-family="Times,serif" font-size="14.00">wav</text>
<polygon fill="lightgrey" stroke="transparent" points="2194,-1414 2194,-1433 2237,-1433 2237,-1414 2194,-1414"/>
<text text-anchor="start" x="2196" y="-1419.8" font-family="Times,serif" font-size="14.00">id3v2</text>
<polygon fill="lightgrey" stroke="transparent" points="2194,-1395 2194,-1414 2237,-1414 2237,-1395 2194,-1395"/>
<text text-anchor="start" x="2196" y="-1400.8" font-family="Times,serif" font-size="14.00">id3v1</text>
<polygon fill="lightgrey" stroke="transparent" points="2194,-1376 2194,-1395 2237,-1395 2237,-1376 2194,-1376"/>
<text text-anchor="start" x="2196" y="-1381.8" font-family="Times,serif" font-size="14.00">id3v11</text>
<polygon fill="paleturquoise" stroke="transparent" points="2204.5,-1376 2204.5,-1452 2247.5,-1452 2247.5,-1376 2204.5,-1376"/>
<text text-anchor="start" x="2214.5" y="-1438.8" font-family="Times,serif" font-size="14.00">wav</text>
<polygon fill="lightgrey" stroke="transparent" points="2205,-1414 2205,-1433 2248,-1433 2248,-1414 2205,-1414"/>
<text text-anchor="start" x="2207" y="-1419.8" font-family="Times,serif" font-size="14.00">id3v2</text>
<polygon fill="lightgrey" stroke="transparent" points="2205,-1395 2205,-1414 2248,-1414 2248,-1395 2205,-1395"/>
<text text-anchor="start" x="2207" y="-1400.8" font-family="Times,serif" font-size="14.00">id3v1</text>
<polygon fill="lightgrey" stroke="transparent" points="2205,-1376 2205,-1395 2248,-1395 2248,-1376 2205,-1376"/>
<text text-anchor="start" x="2207" y="-1381.8" font-family="Times,serif" font-size="14.00">id3v11</text>
</g>
<!-- probe&#45;&gt;wav -->
<g id="edge115" class="edge">
<g id="edge116" class="edge">
<title>probe&#45;&gt;wav:wav</title>
<path fill="none" stroke="black" d="M2243.47,-1511.29C2232.17,-1498.5 2219.11,-1479.9 2216.48,-1460.06"/>
<polygon fill="black" stroke="black" points="2218.91,-1459.82 2216,-1453 2214.03,-1460.15 2218.91,-1459.82"/>
<path fill="none" stroke="black" d="M2337.8,-1517.42C2317.49,-1508.21 2289.92,-1493.61 2270,-1475 2259.9,-1465.56 2263.58,-1450.34 2256.19,-1444.96"/>
<polygon fill="black" stroke="black" points="2256.4,-1442.48 2249,-1443 2255.11,-1447.2 2256.4,-1442.48"/>
</g>
<!-- probe&#45;&gt;webp -->
<g id="edge116" class="edge">
<g id="edge117" class="edge">
<title>probe&#45;&gt;webp:webp</title>
<path fill="none" stroke="black" d="M2233.87,-1527.18C2065.15,-1518.5 1159.3,-1465.5 933,-1317 744.81,-1193.51 720.23,-1108.74 656,-893 650.17,-873.41 654.28,-867.37 656,-847 664.49,-746.53 693.59,-722.36 694.95,-625.13"/>
<path fill="none" stroke="black" d="M2337.77,-1527.54C2161.2,-1520.84 1177.97,-1476.75 933,-1317 744.45,-1194.05 720.23,-1108.74 656,-893 650.17,-873.41 654.28,-867.37 656,-847 664.49,-746.53 693.59,-722.36 694.95,-625.13"/>
<polygon fill="black" stroke="black" points="697.4,-625.02 695,-618 692.5,-624.98 697.4,-625.02"/>
</g>
<!-- elf -->
<!-- zip -->
<g id="node62" class="node">
<title>zip</title>
<polygon fill="paleturquoise" stroke="transparent" points="2504,-1395 2504,-1433 2540,-1433 2540,-1395 2504,-1395"/>
<text text-anchor="start" x="2513" y="-1419.8" font-family="Times,serif" font-size="14.00">zip</text>
<polygon fill="lightgrey" stroke="transparent" points="2504,-1395 2504,-1414 2540,-1414 2540,-1395 2504,-1395"/>
<text text-anchor="start" x="2506" y="-1400.8" font-family="Times,serif" font-size="14.00">probe</text>
</g>
<!-- probe&#45;&gt;zip -->
<g id="edge119" class="edge">
<title>probe&#45;&gt;zip:zip</title>
<path fill="none" stroke="black" d="M2392.09,-1515.23C2395.09,-1513.79 2398.1,-1512.35 2401,-1511 2436.31,-1494.48 2453.65,-1502.78 2481,-1475 2496.29,-1459.47 2482.49,-1431.61 2496.03,-1425.3"/>
<polygon fill="black" stroke="black" points="2496.57,-1427.69 2503,-1424 2495.67,-1422.87 2496.57,-1427.69"/>
</g>
<!-- elf -->
<g id="node63" class="node">
<title>elf</title>
<polygon fill="paleturquoise" stroke="transparent" points="2594.5,-1404.5 2594.5,-1423.5 2613.5,-1423.5 2613.5,-1404.5 2594.5,-1404.5"/>
<text text-anchor="start" x="2597" y="-1409.8" font-family="Times,serif" font-size="14.00">elf</text>
<polygon fill="paleturquoise" stroke="transparent" points="2584.5,-1404.5 2584.5,-1423.5 2603.5,-1423.5 2603.5,-1404.5 2584.5,-1404.5"/>
<text text-anchor="start" x="2587" y="-1409.8" font-family="Times,serif" font-size="14.00">elf</text>
</g>
<!-- probe&#45;&gt;elf -->
<g id="edge96" class="edge">
<g id="edge97" class="edge">
<title>probe&#45;&gt;elf:elf</title>
<path fill="none" stroke="black" d="M2288.15,-1514.19C2291.09,-1512.98 2294.07,-1511.88 2297,-1511 2411.2,-1476.49 2461.37,-1537.48 2563,-1475 2580.13,-1464.47 2592.01,-1444.04 2598.65,-1429.73"/>
<polygon fill="black" stroke="black" points="2600.92,-1430.67 2601.5,-1423.27 2596.44,-1428.69 2600.92,-1430.67"/>
<path fill="none" stroke="black" d="M2392.24,-1514.46C2395.16,-1513.2 2398.12,-1512.02 2401,-1511 2468.52,-1487.2 2499.96,-1516.91 2558,-1475 2573.56,-1463.76 2583.84,-1443.77 2589.53,-1429.75"/>
<polygon fill="black" stroke="black" points="2591.89,-1430.45 2592.09,-1423.04 2587.31,-1428.7 2591.89,-1430.45"/>
</g>
<!-- probe&#45;&gt;gif -->
<g id="edge98" class="edge">
<g id="edge99" class="edge">
<title>probe&#45;&gt;gif:gif</title>
<path fill="none" stroke="black" d="M2621,-869C2628.32,-778.86 2624.65,-671.3 2622.36,-623.3"/>
<polygon fill="black" stroke="black" points="2624.8,-622.99 2622.01,-616.12 2619.91,-623.23 2624.8,-622.99"/>
<path fill="none" stroke="black" d="M2621,-869C2631.52,-779.18 2626.24,-671.46 2622.96,-623.36"/>
<polygon fill="black" stroke="black" points="2625.39,-622.97 2622.45,-616.16 2620.5,-623.32 2625.39,-622.97"/>
</g>
<!-- json -->
<g id="node64" class="node">
<g id="node65" class="node">
<title>json</title>
<polygon fill="paleturquoise" stroke="transparent" points="2700,-1404.5 2700,-1423.5 2728,-1423.5 2728,-1404.5 2700,-1404.5"/>
<text text-anchor="start" x="2702" y="-1409.8" font-family="Times,serif" font-size="14.00">json</text>
</g>
<!-- probe&#45;&gt;json -->
<g id="edge103" class="edge">
<g id="edge104" class="edge">
<title>probe&#45;&gt;json:json</title>
<path fill="none" stroke="black" d="M2288.12,-1514.08C2291.06,-1512.89 2294.06,-1511.83 2297,-1511 2377.81,-1488.29 2600.89,-1517.96 2673,-1475 2690.15,-1464.79 2701.65,-1444.28 2708,-1429.88"/>
<polygon fill="black" stroke="black" points="2710.28,-1430.77 2710.7,-1423.37 2705.75,-1428.89 2710.28,-1430.77"/>
<path fill="none" stroke="black" d="M2392.15,-1514.18C2395.09,-1512.97 2398.07,-1511.88 2401,-1511 2517.78,-1475.89 2569.38,-1539.29 2673,-1475 2689.96,-1464.48 2701.5,-1444.04 2707.91,-1429.74"/>
<polygon fill="black" stroke="black" points="2710.17,-1430.68 2710.65,-1423.28 2705.66,-1428.76 2710.17,-1430.68"/>
</g>
<!-- mpeg_ts -->
<g id="node65" class="node">
<g id="node66" class="node">
<title>mpeg_ts</title>
<polygon fill="paleturquoise" stroke="transparent" points="2767,-1404.5 2767,-1423.5 2819,-1423.5 2819,-1404.5 2767,-1404.5"/>
<text text-anchor="start" x="2769" y="-1409.8" font-family="Times,serif" font-size="14.00">mpeg_ts</text>
</g>
<!-- probe&#45;&gt;mpeg_ts -->
<g id="edge108" class="edge">
<g id="edge109" class="edge">
<title>probe&#45;&gt;mpeg_ts:mpeg_ts</title>
<path fill="none" stroke="black" d="M2288.11,-1514.03C2291.05,-1512.85 2294.05,-1511.8 2297,-1511 2394.44,-1484.46 2662.27,-1525.01 2750,-1475 2767.61,-1464.96 2779.75,-1444.42 2786.53,-1429.96"/>
<polygon fill="black" stroke="black" points="2788.84,-1430.81 2789.43,-1423.42 2784.36,-1428.82 2788.84,-1430.81"/>
<path fill="none" stroke="black" d="M2392.13,-1514.1C2395.07,-1512.9 2398.06,-1511.84 2401,-1511 2550.96,-1468.26 2615.44,-1553.8 2750,-1475 2767.49,-1464.76 2779.66,-1444.26 2786.48,-1429.86"/>
<polygon fill="black" stroke="black" points="2788.77,-1430.75 2789.4,-1423.36 2784.3,-1428.74 2788.77,-1430.75"/>
</g>
<!-- flac_metadatablocks -->
<g id="node18" class="node">
@ -665,8 +679,8 @@
<!-- gzip&#45;&gt;probe -->
<g id="edge19" class="edge">
<title>gzip:probe&#45;&gt;probe</title>
<path fill="none" stroke="black" d="M1912,-1404C1945.04,-1404 1909.08,-1453.31 1934,-1475 1977.26,-1512.66 2151.52,-1524.11 2226.46,-1527.33"/>
<polygon fill="black" stroke="black" points="2226.73,-1529.8 2233.82,-1527.64 2226.93,-1524.9 2226.73,-1529.8"/>
<path fill="none" stroke="black" d="M1945,-1404C1978.04,-1404 1941.77,-1453.67 1967,-1475 2021.64,-1521.2 2244.54,-1527.71 2330.74,-1528.47"/>
<polygon fill="black" stroke="black" points="2330.9,-1530.92 2337.92,-1528.53 2330.94,-1526.02 2330.9,-1530.92"/>
</g>
<!-- hevc_annexb -->
<g id="node25" class="node">
@ -763,8 +777,8 @@
<!-- matroska&#45;&gt;image -->
<g id="edge35" class="edge">
<title>matroska:image&#45;&gt;image</title>
<path fill="none" stroke="black" d="M1070,-1113C1462.61,-1113 1545.39,-984.94 1934,-929 2142.24,-899.02 2203.77,-951 2406,-893 2408.61,-892.25 2411.24,-891.33 2413.84,-890.3"/>
<polygon fill="black" stroke="black" points="2415.21,-892.37 2420.65,-887.33 2413.25,-887.88 2415.21,-892.37"/>
<path fill="none" stroke="black" d="M1070,-1113C1476.97,-1113 1564.13,-986.62 1967,-929 2160.79,-901.28 2217.98,-947.51 2406,-893 2408.6,-892.25 2411.23,-891.32 2413.84,-890.28"/>
<polygon fill="black" stroke="black" points="2415.21,-892.36 2420.64,-887.31 2413.25,-887.87 2415.21,-892.36"/>
</g>
<!-- matroska&#45;&gt;av1_frame -->
<g id="edge28" class="edge">
@ -787,14 +801,14 @@
<!-- matroska&#45;&gt;flac_metadatablocks -->
<g id="edge32" class="edge">
<title>matroska:flac_metadatablocks&#45;&gt;flac_metadatablocks</title>
<path fill="none" stroke="black" d="M1070,-1171C1195.78,-1171 1103.95,-1017.33 1123,-893 1157.42,-668.33 1127.61,-605.69 1182,-385 1185.22,-371.95 1190.29,-358.02 1195.1,-346.22"/>
<polygon fill="black" stroke="black" points="1197.45,-346.95 1197.88,-339.54 1192.93,-345.06 1197.45,-346.95"/>
<path fill="none" stroke="black" d="M1070,-1171C1112.67,-1171 1188.43,-497.49 1204.82,-347.06"/>
<polygon fill="black" stroke="black" points="1207.28,-347.11 1205.6,-339.89 1202.4,-346.58 1207.28,-347.11"/>
</g>
<!-- matroska&#45;&gt;flac_frame -->
<g id="edge31" class="edge">
<title>matroska:flac_frame&#45;&gt;flac_frame</title>
<path fill="none" stroke="black" d="M1070,-1190C1244.44,-1190 1132.25,-980.85 1172,-811 1216,-623.02 1160.4,-552.16 1257,-385 1267.69,-366.49 1285.33,-350.48 1301.02,-338.7"/>
<polygon fill="black" stroke="black" points="1302.49,-340.66 1306.7,-334.56 1299.6,-336.71 1302.49,-340.66"/>
<path fill="none" stroke="black" d="M1070,-1190C1170.55,-1190 1253.49,-391.34 1257,-385 1267.28,-366.44 1284.71,-350.52 1300.39,-338.8"/>
<polygon fill="black" stroke="black" points="1301.84,-340.77 1306.07,-334.68 1298.96,-336.81 1301.84,-340.77"/>
</g>
<!-- matroska&#45;&gt;hevc_au -->
<g id="edge33" class="edge">
@ -831,8 +845,8 @@
<!-- matroska&#45;&gt;mp3_frame -->
<g id="edge36" class="edge">
<title>matroska:mp3_frame&#45;&gt;mp3_frame</title>
<path fill="none" stroke="black" d="M1070,-1094C1469.02,-1094 1587.68,-1070.6 1945,-893 1995.86,-867.72 2004.65,-852.88 2043,-811 2198.88,-640.78 2181.48,-552.76 2340,-385 2354.16,-370.01 2371.8,-355.58 2387.4,-343.95"/>
<polygon fill="black" stroke="black" points="2388.87,-345.91 2393.05,-339.79 2385.96,-341.96 2388.87,-345.91"/>
<path fill="none" stroke="black" d="M1070,-1094C1465.12,-1094 1582.82,-1070.16 1936,-893 1986.46,-867.69 1994.66,-852.43 2033,-811 2191.52,-639.72 2178.4,-553.37 2340,-385 2354.4,-370 2372.22,-355.48 2387.9,-343.77"/>
<polygon fill="black" stroke="black" points="2389.39,-345.71 2393.57,-339.59 2386.48,-341.77 2389.39,-345.71"/>
</g>
<!-- mpeg_asc -->
<g id="node36" class="node">
@ -855,20 +869,20 @@
<!-- matroska&#45;&gt;mpeg_pes_packet -->
<g id="edge38" class="edge">
<title>matroska:mpeg_pes_packet&#45;&gt;mpeg_pes_packet</title>
<path fill="none" stroke="black" d="M1070,-1056C1285.44,-1056 1867.91,-974.67 2008,-811 2069.87,-738.72 1986.87,-455.29 2051,-385 2107.46,-323.12 2156.23,-374.57 2236,-349 2245.78,-345.86 2256.01,-341.72 2265.5,-337.46"/>
<polygon fill="black" stroke="black" points="2266.6,-339.65 2271.94,-334.51 2264.55,-335.2 2266.6,-339.65"/>
<path fill="none" stroke="black" d="M1070,-1056C1283.29,-1056 1859.52,-973.22 1998,-811 2059.78,-738.64 1976.53,-454.98 2041,-385 2100.71,-320.18 2151.95,-375.5 2236,-349 2245.8,-345.91 2256.03,-341.78 2265.52,-337.53"/>
<polygon fill="black" stroke="black" points="2266.62,-339.72 2271.96,-334.58 2264.58,-335.27 2266.62,-339.72"/>
</g>
<!-- mpeg_spu -->
<g id="node38" class="node">
<title>mpeg_spu</title>
<polygon fill="paleturquoise" stroke="transparent" points="2101,-860.5 2101,-879.5 2163,-879.5 2163,-860.5 2101,-860.5"/>
<text text-anchor="start" x="2103" y="-865.8" font-family="Times,serif" font-size="14.00">mpeg_spu</text>
<polygon fill="paleturquoise" stroke="transparent" points="2091,-860.5 2091,-879.5 2153,-879.5 2153,-860.5 2091,-860.5"/>
<text text-anchor="start" x="2093" y="-865.8" font-family="Times,serif" font-size="14.00">mpeg_spu</text>
</g>
<!-- matroska&#45;&gt;mpeg_spu -->
<g id="edge39" class="edge">
<title>matroska:mpeg_spu&#45;&gt;mpeg_spu</title>
<path fill="none" stroke="black" d="M1070,-1037C1296.49,-1037 1860.57,-952.89 2079,-893 2081.81,-892.23 2084.67,-891.35 2087.53,-890.39"/>
<polygon fill="black" stroke="black" points="2088.41,-892.68 2094.19,-888.04 2086.77,-888.06 2088.41,-892.68"/>
<path fill="none" stroke="black" d="M1070,-1037C1518.59,-1037 1636.46,-1011.92 2069,-893 2071.81,-892.23 2074.67,-891.34 2077.53,-890.39"/>
<polygon fill="black" stroke="black" points="2078.41,-892.67 2084.19,-888.03 2076.77,-888.06 2078.41,-892.67"/>
</g>
<!-- opus_packet -->
<g id="node39" class="node">
@ -881,8 +895,8 @@
<!-- matroska&#45;&gt;opus_packet -->
<g id="edge40" class="edge">
<title>matroska:opus_packet&#45;&gt;opus_packet</title>
<path fill="none" stroke="black" d="M1070,-1018C1226.89,-1018 1635.83,-923.69 1745,-811 1881.54,-670.06 1746.75,-544.54 1861,-385 1873.11,-368.09 1890.87,-354.14 1908.08,-343.4"/>
<polygon fill="black" stroke="black" points="1909.66,-345.31 1914.38,-339.59 1907.12,-341.12 1909.66,-345.31"/>
<path fill="none" stroke="black" d="M1070,-1018C1226.89,-1018 1637.08,-924.88 1745,-811 1879.21,-669.39 1735.72,-542.4 1851,-385 1859.39,-373.54 1886.44,-356.88 1911.62,-342.98"/>
<polygon fill="black" stroke="black" points="1913,-345.02 1917.96,-339.51 1910.65,-340.72 1913,-345.02"/>
</g>
<!-- vorbis_packet -->
<g id="node40" class="node">
@ -949,9 +963,9 @@
<!-- opus_packet&#45;&gt;vorbis_comment -->
<g id="edge82" class="edge">
<title>opus_packet:vorbis_comment&#45;&gt;vorbis_comment</title>
<path fill="none" stroke="black" d="M2123,-205C2098.65,-134.12 1822.17,-110.15 1774.1,-106.51"/>
<polygon fill="black" stroke="black" points="1774.22,-104.06 1767.06,-106 1773.87,-108.95 1774.22,-104.06"/>
<path fill="none" stroke="black" d="M2012,-306.5C2078.25,-306.5 2144.53,-269.66 2123,-207"/>
<path fill="none" stroke="black" d="M2123,-205C2098.67,-134.17 1822.55,-110.19 1774.2,-106.52"/>
<polygon fill="black" stroke="black" points="1774.16,-104.06 1767,-106 1773.81,-108.95 1774.16,-104.06"/>
</g>
<!-- vorbis_packet&#45;&gt;vorbis_comment -->
<g id="edge89" class="edge">
@ -962,18 +976,18 @@
<!-- mp3&#45;&gt;apev2 -->
<g id="edge48" class="edge">
<title>mp3:apev2&#45;&gt;apev2</title>
<path fill="none" stroke="black" d="M2341,-1385C2356.9,-1385 2346.75,-1365.16 2357,-1353 2374.42,-1332.34 2391.29,-1339.67 2406,-1317 2439.04,-1266.09 2446.47,-1193.33 2447.91,-1153.26"/>
<polygon fill="black" stroke="black" points="2450.36,-1153.24 2448.11,-1146.17 2445.46,-1153.1 2450.36,-1153.24"/>
<path fill="none" stroke="black" d="M2357,-1385C2372.9,-1385 2363.98,-1366.1 2373,-1353 2385.31,-1335.12 2396.01,-1336.27 2406,-1317 2433.66,-1263.62 2443.13,-1192.84 2446.36,-1153.53"/>
<polygon fill="black" stroke="black" points="2448.83,-1153.26 2446.92,-1146.1 2443.95,-1152.89 2448.83,-1153.26"/>
</g>
<!-- mp3&#45;&gt;id3v2 -->
<g id="edge45" class="edge">
<title>mp3:id3v2&#45;&gt;id3v2</title>
<path fill="none" stroke="black" d="M2341,-1443C2344.55,-1443 2361.59,-1320.52 2362,-1317 2385.02,-1119.67 2350.58,-1065.3 2392,-871"/>
<path fill="none" stroke="black" d="M2357,-1443C2372.92,-1443 2388.68,-886.57 2392,-871"/>
</g>
<!-- mp3&#45;&gt;mp3_frame -->
<g id="edge49" class="edge">
<title>mp3:mp3_frame&#45;&gt;mp3_frame</title>
<path fill="none" stroke="black" d="M2306,-1356C2306,-1334.4 2327.74,-1337.34 2335,-1317 2404.68,-1121.73 2310.4,-581 2378,-385 2382.91,-370.76 2391.84,-356.87 2400.67,-345.44"/>
<path fill="none" stroke="black" d="M2322,-1356C2322,-1337.73 2331.66,-1334.96 2335,-1317 2410.84,-909.33 2242.8,-777 2378,-385 2382.91,-370.76 2391.84,-356.87 2400.67,-345.44"/>
<polygon fill="black" stroke="black" points="2402.81,-346.69 2405.26,-339.69 2398.98,-343.63 2402.81,-346.69"/>
</g>
<!-- id3v1 -->
@ -985,8 +999,8 @@
<!-- mp3&#45;&gt;id3v1 -->
<g id="edge46" class="edge">
<title>mp3:id3v1&#45;&gt;id3v1</title>
<path fill="none" stroke="black" d="M2270,-1424C2242.37,-1424 2280.08,-1219.73 2294.12,-1148.3"/>
<polygon fill="black" stroke="black" points="2296.52,-1148.77 2295.48,-1141.43 2291.72,-1147.82 2296.52,-1148.77"/>
<path fill="none" stroke="black" d="M2286,-1424C2258.52,-1424 2285.12,-1220.55 2295.36,-1148.74"/>
<polygon fill="black" stroke="black" points="2297.84,-1148.7 2296.41,-1141.43 2292.99,-1148.01 2297.84,-1148.7"/>
</g>
<!-- id3v11 -->
<g id="node46" class="node">
@ -997,8 +1011,8 @@
<!-- mp3&#45;&gt;id3v11 -->
<g id="edge47" class="edge">
<title>mp3:id3v11&#45;&gt;id3v11</title>
<path fill="none" stroke="black" d="M2270,-1404C2257.1,-1404 2234.52,-1216.61 2226.73,-1148.43"/>
<polygon fill="black" stroke="black" points="2229.12,-1147.77 2225.9,-1141.09 2224.26,-1148.33 2229.12,-1147.77"/>
<path fill="none" stroke="black" d="M2286,-1404C2272.94,-1404 2239.63,-1215.85 2228.04,-1148.01"/>
<polygon fill="black" stroke="black" points="2230.46,-1147.58 2226.87,-1141.09 2225.63,-1148.41 2230.46,-1147.58"/>
</g>
<!-- mp4&#45;&gt;aac_frame -->
<g id="edge51" class="edge">
@ -1009,8 +1023,8 @@
<!-- mp4&#45;&gt;image -->
<g id="edge57" class="edge">
<title>mp4:image&#45;&gt;image</title>
<path fill="none" stroke="black" d="M1729,-665C1816.48,-665 1782.89,-771.61 1861,-811 1885.83,-823.52 2291.08,-856.55 2413.35,-866.27"/>
<polygon fill="black" stroke="black" points="2413.48,-868.74 2420.65,-866.85 2413.87,-863.85 2413.48,-868.74"/>
<path fill="none" stroke="black" d="M1729,-665C1813.56,-665 1776.22,-771.52 1851,-811 1876.08,-824.24 2291.02,-856.97 2413.95,-866.41"/>
<polygon fill="black" stroke="black" points="2413.77,-868.85 2420.94,-866.95 2414.15,-863.97 2413.77,-868.85"/>
</g>
<!-- mp4&#45;&gt;av1_frame -->
<g id="edge53" class="edge">
@ -1057,14 +1071,14 @@
<!-- mp4&#45;&gt;id3v2 -->
<g id="edge56" class="edge">
<title>mp4:id3v2&#45;&gt;id3v2</title>
<path fill="none" stroke="black" d="M1729,-684C1874.26,-684 1741.66,-467.82 1861,-385 1973.84,-306.7 2350.89,-401.03 2478,-349 2481.19,-347.69 2484.3,-345.98 2487.26,-344.03"/>
<polygon fill="black" stroke="black" points="2488.92,-345.85 2493.12,-339.73 2486.03,-341.89 2488.92,-345.85"/>
<path fill="none" stroke="black" d="M1729,-684C1872.53,-684 1734.22,-468.44 1851,-385 1964.56,-303.87 2348.82,-401.81 2478,-349 2481.19,-347.69 2484.3,-345.98 2487.26,-344.03"/>
<polygon fill="black" stroke="black" points="2488.92,-345.85 2493.12,-339.74 2486.03,-341.9 2488.92,-345.85"/>
</g>
<!-- mp4&#45;&gt;jpeg -->
<g id="edge58" class="edge">
<title>mp4:jpeg&#45;&gt;jpeg</title>
<path fill="none" stroke="black" d="M1729,-646C1858.99,-646 1752.08,-455.95 1861,-385 1925.33,-343.1 2475.76,-364.23 2551,-349 2564.41,-346.29 2578.52,-341.89 2591.39,-337.24"/>
<polygon fill="black" stroke="black" points="2592.28,-339.52 2597.99,-334.78 2590.58,-334.92 2592.28,-339.52"/>
<path fill="none" stroke="black" d="M1729,-646C1857.05,-646 1744.78,-456.5 1851,-385 1915.61,-341.51 2474.66,-364.43 2551,-349 2564.41,-346.29 2578.52,-341.9 2591.39,-337.24"/>
<polygon fill="black" stroke="black" points="2592.28,-339.52 2597.99,-334.79 2590.58,-334.93 2592.28,-339.52"/>
</g>
<!-- mp4&#45;&gt;av1_ccr -->
<g id="edge52" class="edge">
@ -1075,20 +1089,20 @@
<!-- mp4&#45;&gt;mp3_frame -->
<g id="edge59" class="edge">
<title>mp4:mp3_frame&#45;&gt;mp3_frame</title>
<path fill="none" stroke="black" d="M1729,-627C1851.52,-627 1757.9,-451.18 1861,-385 1957.36,-323.14 2266.01,-384.11 2375,-349 2379.84,-347.44 2384.68,-345.33 2389.36,-342.94"/>
<polygon fill="black" stroke="black" points="2390.64,-345.03 2395.61,-339.53 2388.29,-340.73 2390.64,-345.03"/>
<path fill="none" stroke="black" d="M1729,-627C1849.45,-627 1750.66,-451.64 1851,-385 1948.23,-320.43 2263.88,-384.71 2375,-349 2379.84,-347.45 2384.68,-345.34 2389.36,-342.95"/>
<polygon fill="black" stroke="black" points="2390.64,-345.04 2395.61,-339.53 2388.3,-340.74 2390.64,-345.04"/>
</g>
<!-- mp4&#45;&gt;mpeg_pes_packet -->
<g id="edge65" class="edge">
<title>mp4:mpeg_pes_packet&#45;&gt;mpeg_pes_packet</title>
<path fill="none" stroke="black" d="M1729,-512C1810.41,-512 1787.03,-419 1861,-385 2013.13,-315.06 2074.28,-392.36 2236,-349 2246.43,-346.2 2257.27,-341.96 2267.17,-337.49"/>
<polygon fill="black" stroke="black" points="2268.22,-339.71 2273.53,-334.54 2266.15,-335.27 2268.22,-339.71"/>
<path fill="none" stroke="black" d="M1729,-512C1807.27,-512 1780.5,-419 1851,-385 2005.8,-310.35 2069.95,-393.31 2236,-349 2246.44,-346.22 2257.27,-341.98 2267.17,-337.51"/>
<polygon fill="black" stroke="black" points="2268.22,-339.73 2273.53,-334.55 2266.15,-335.28 2268.22,-339.73"/>
</g>
<!-- mp4&#45;&gt;opus_packet -->
<g id="edge66" class="edge">
<title>mp4:opus_packet&#45;&gt;opus_packet</title>
<path fill="none" stroke="black" d="M1729,-493C1781.35,-493 1736.89,-419.79 1776,-385 1817.28,-348.27 1843.47,-368.96 1895,-349 1900.08,-347.03 1905.31,-344.84 1910.49,-342.55"/>
<polygon fill="black" stroke="black" points="1911.65,-344.72 1917.03,-339.62 1909.64,-340.25 1911.65,-344.72"/>
<path fill="none" stroke="black" d="M1729,-493C1785.96,-493 1753.67,-420.76 1798,-385 1833.79,-356.13 1852.65,-366.92 1895,-349 1899.74,-346.99 1904.64,-344.83 1909.52,-342.61"/>
<polygon fill="black" stroke="black" points="1910.82,-344.71 1916.16,-339.57 1908.77,-340.26 1910.82,-344.71"/>
</g>
<!-- mp4&#45;&gt;vorbis_packet -->
<g id="edge69" class="edge">
@ -1129,8 +1143,8 @@
<!-- mp4&#45;&gt;protobuf_widevine -->
<g id="edge67" class="edge">
<title>mp4:protobuf_widevine&#45;&gt;protobuf_widevine</title>
<path fill="none" stroke="black" d="M1729,-474C1773.73,-474 1752.92,-423.32 1776,-385 1783.97,-371.76 1793.5,-357.56 1801.8,-345.61"/>
<polygon fill="black" stroke="black" points="1804.01,-346.73 1806.02,-339.59 1800,-343.92 1804.01,-346.73"/>
<path fill="none" stroke="black" d="M1729,-474C1758.39,-474 1794.15,-391.43 1811.52,-346.24"/>
<polygon fill="black" stroke="black" points="1813.85,-347 1814.05,-339.59 1809.27,-345.26 1813.85,-347"/>
</g>
<!-- pssh_playready -->
<g id="node51" class="node">
@ -1193,42 +1207,42 @@
<!-- mpeg_pes&#45;&gt;mpeg_pes_packet -->
<g id="edge74" class="edge">
<title>mpeg_pes:mpeg_pes_packet&#45;&gt;mpeg_pes_packet</title>
<path fill="none" stroke="black" d="M2131,-1122C2152.57,-1122 2143.9,-948.99 2152,-929 2159.61,-910.21 2171.41,-911.36 2180,-893 2272.94,-694.27 2297.9,-424.36 2303.54,-342.22"/>
<polygon fill="black" stroke="black" points="2306.01,-342.01 2304.03,-334.86 2301.12,-341.68 2306.01,-342.01"/>
<path fill="none" stroke="black" d="M2131,-1122C2152.57,-1122 2145.91,-949.69 2152,-929 2157.05,-911.84 2163.92,-909.82 2170,-893 2244.73,-686.38 2288.88,-422.85 2301.34,-342.11"/>
<polygon fill="black" stroke="black" points="2303.81,-342.16 2302.45,-334.87 2298.97,-341.42 2303.81,-342.16"/>
</g>
<!-- mpeg_pes&#45;&gt;mpeg_spu -->
<g id="edge75" class="edge">
<title>mpeg_pes:mpeg_spu&#45;&gt;mpeg_spu</title>
<path fill="none" stroke="black" d="M2078,-1093C2078,-1019.25 2106.48,-935.53 2122.08,-895.22"/>
<polygon fill="black" stroke="black" points="2124.55,-895.62 2124.83,-888.21 2119.99,-893.83 2124.55,-895.62"/>
<path fill="none" stroke="black" d="M2078,-1093C2078,-1019.61 2101.42,-935.13 2114.09,-894.81"/>
<polygon fill="black" stroke="black" points="2116.46,-895.46 2116.25,-888.04 2111.79,-893.97 2116.46,-895.46"/>
</g>
<!-- ogg&#45;&gt;flac_frame -->
<g id="edge81" class="edge">
<title>ogg:flac_frame&#45;&gt;flac_frame</title>
<path fill="none" stroke="black" d="M1877,-540C1786.52,-540 1825.16,-426.97 1745,-385 1602.16,-310.2 1536.5,-401.37 1384,-349 1376.57,-346.45 1369.11,-342.61 1362.31,-338.47"/>
<path fill="none" stroke="black" d="M1867,-540C1779.33,-540 1821.87,-427.16 1745,-385 1603.63,-307.46 1536.5,-401.37 1384,-349 1376.57,-346.45 1369.11,-342.61 1362.31,-338.47"/>
<polygon fill="black" stroke="black" points="1363.48,-336.32 1356.26,-334.62 1360.85,-340.45 1363.48,-336.32"/>
</g>
<!-- ogg&#45;&gt;flac_metadatablock -->
<g id="edge80" class="edge">
<title>ogg:flac_metadatablock&#45;&gt;flac_metadatablock</title>
<path fill="none" stroke="black" d="M1992,-559C2011.47,-559 2008.04,-403.83 2013,-385 2017.41,-368.24 2024.6,-366 2028,-349 2033.67,-320.67 2047.4,-305.41 2028,-284 1973.43,-223.76 1741.6,-272.2 1664,-248 1663.13,-247.73 1662.26,-247.45 1661.39,-247.16"/>
<path fill="none" stroke="black" d="M1982,-559C2020.95,-559 1989.15,-421.4 2003,-385 2009.93,-366.79 2022.18,-367.59 2028,-349 2036.63,-321.43 2047.4,-305.41 2028,-284 1973.43,-223.76 1741.6,-272.2 1664,-248 1663.13,-247.73 1662.26,-247.45 1661.39,-247.16"/>
<polygon fill="black" stroke="black" points="1662.14,-244.82 1654.72,-244.73 1660.47,-249.43 1662.14,-244.82"/>
</g>
<!-- ogg&#45;&gt;vorbis_comment -->
<g id="edge78" class="edge">
<title>ogg:vorbis_comment&#45;&gt;vorbis_comment</title>
<path fill="none" stroke="black" d="M1992,-597C2039.34,-597 1986.61,-424.3 2013,-385 2032.06,-356.61 2059.35,-375.47 2081,-349 2122.68,-298.06 2144.38,-269.24 2123,-207"/>
<path fill="none" stroke="black" d="M1982,-597C2029.34,-597 1975.55,-423.57 2003,-385 2025.14,-353.89 2056.03,-377.88 2081,-349 2124.05,-299.22 2144.38,-269.24 2123,-207"/>
</g>
<!-- ogg&#45;&gt;opus_packet -->
<g id="edge79" class="edge">
<title>ogg:opus_packet&#45;&gt;opus_packet</title>
<path fill="none" stroke="black" d="M1992,-578C2038.14,-578 1991.82,-414.81 1970.5,-346.76"/>
<polygon fill="black" stroke="black" points="1972.72,-345.65 1968.28,-339.71 1968.05,-347.12 1972.72,-345.65"/>
<path fill="none" stroke="black" d="M1982,-578C2004.98,-578 1978.43,-414.81 1966.36,-346.76"/>
<polygon fill="black" stroke="black" points="1968.74,-346.17 1965.1,-339.71 1963.92,-347.03 1968.74,-346.17"/>
</g>
<!-- ogg&#45;&gt;vorbis_packet -->
<g id="edge77" class="edge">
<title>ogg:vorbis_packet&#45;&gt;vorbis_packet</title>
<path fill="none" stroke="black" d="M1992,-617C2017.88,-617 2000.39,-407.6 2013,-385 2025.99,-361.71 2049.07,-372.85 2061,-349 2073.92,-323.16 2080,-305.76 2061,-284 2022.06,-239.39 1852.77,-267.88 1797,-248 1786.46,-244.24 1775.8,-238.69 1766.17,-232.87"/>
<path fill="none" stroke="black" d="M1982,-617C2007.88,-617 1989.41,-407.03 2003,-385 2018.93,-359.18 2046.25,-375.51 2061,-349 2075.04,-323.75 2080,-305.76 2061,-284 2022.06,-239.39 1852.77,-267.88 1797,-248 1786.46,-244.24 1775.8,-238.69 1766.17,-232.87"/>
<polygon fill="black" stroke="black" points="1767.24,-230.65 1760.01,-229.02 1764.65,-234.8 1767.24,-230.65"/>
</g>
<!-- ogg_page -->
@ -1240,8 +1254,8 @@
<!-- ogg&#45;&gt;ogg_page -->
<g id="edge76" class="edge">
<title>ogg:ogg_page&#45;&gt;ogg_page</title>
<path fill="none" stroke="black" d="M1992,-636C2019.99,-636 1995.28,-406.66 2013,-385 2049.35,-340.59 2084.45,-372.06 2137,-349 2143.81,-346.01 2150.82,-342.28 2157.39,-338.44"/>
<polygon fill="black" stroke="black" points="2159.06,-340.29 2163.8,-334.59 2156.54,-336.09 2159.06,-340.29"/>
<path fill="none" stroke="black" d="M1982,-636C2009.99,-636 1985.06,-406.48 2003,-385 2042.53,-337.67 2080.29,-373.22 2137,-349 2144.06,-345.99 2151.31,-342.14 2158.06,-338.18"/>
<polygon fill="black" stroke="black" points="2159.38,-340.25 2164.11,-334.53 2156.85,-336.05 2159.38,-340.25"/>
</g>
<!-- png&#45;&gt;exif -->
<g id="edge84" class="edge">
@ -1259,8 +1273,8 @@
<!-- tar&#45;&gt;probe -->
<g id="edge86" class="edge">
<title>tar:probe&#45;&gt;probe</title>
<path fill="none" stroke="black" d="M2374,-1404C2341.55,-1404 2376.6,-1449.14 2357,-1475 2352.7,-1480.68 2320.74,-1497.94 2294.86,-1511.33"/>
<polygon fill="black" stroke="black" points="2293.54,-1509.26 2288.44,-1514.65 2295.78,-1513.62 2293.54,-1509.26"/>
<path fill="none" stroke="black" d="M2390,-1404C2384.94,-1404 2374.3,-1467.93 2368.67,-1504.17"/>
<polygon fill="black" stroke="black" points="2366.19,-1504.16 2367.55,-1511.45 2371.03,-1504.9 2366.19,-1504.16"/>
</g>
<!-- tiff&#45;&gt;icc_profile -->
<g id="edge87" class="edge">
@ -1270,21 +1284,21 @@
<!-- wav&#45;&gt;id3v2 -->
<g id="edge90" class="edge">
<title>wav:id3v2&#45;&gt;id3v2</title>
<path fill="none" stroke="black" d="M2392,-869C2416.24,-764.08 2359.98,-476.97 2416,-385 2432.58,-357.79 2452.11,-367.58 2478,-349 2481.81,-346.27 2485.69,-343.21 2489.42,-340.1"/>
<path fill="none" stroke="black" d="M2392,-869C2438.96,-658.81 2303.95,-568.93 2416,-385 2432.58,-357.79 2452.11,-367.58 2478,-349 2481.81,-346.27 2485.69,-343.21 2489.42,-340.1"/>
<polygon fill="black" stroke="black" points="2491.03,-341.95 2494.76,-335.54 2487.84,-338.22 2491.03,-341.95"/>
<path fill="none" stroke="black" d="M2193,-1424C2175.41,-1424 2131.67,-1000.74 2186,-929 2243.42,-853.18 2368.72,-963.22 2392,-871"/>
<path fill="none" stroke="black" d="M2204,-1424C2182.79,-1424 2133.68,-998.09 2186,-929 2243.42,-853.18 2371.09,-963.79 2392,-871"/>
</g>
<!-- wav&#45;&gt;id3v1 -->
<g id="edge91" class="edge">
<title>wav:id3v1&#45;&gt;id3v1</title>
<path fill="none" stroke="black" d="M2238,-1404C2240.51,-1404 2262.42,-1319.45 2263,-1317 2277.2,-1256.92 2289.33,-1185.25 2295.21,-1148.46"/>
<polygon fill="black" stroke="black" points="2297.69,-1148.45 2296.36,-1141.15 2292.85,-1147.68 2297.69,-1148.45"/>
<path fill="none" stroke="black" d="M2249,-1404C2261.93,-1404 2287.17,-1216.61 2295.92,-1148.43"/>
<polygon fill="black" stroke="black" points="2298.4,-1148.35 2296.86,-1141.09 2293.54,-1147.73 2298.4,-1148.35"/>
</g>
<!-- wav&#45;&gt;id3v11 -->
<g id="edge92" class="edge">
<title>wav:id3v11&#45;&gt;id3v11</title>
<path fill="none" stroke="black" d="M2216,-1375C2216,-1291.75 2220.45,-1193.04 2222.71,-1148.26"/>
<polygon fill="black" stroke="black" points="2225.17,-1148.15 2223.08,-1141.04 2220.28,-1147.9 2225.17,-1148.15"/>
<path fill="none" stroke="black" d="M2227,-1375C2227,-1291.78 2225.33,-1193.06 2224.48,-1148.26"/>
<polygon fill="black" stroke="black" points="2226.93,-1147.99 2224.34,-1141.04 2222.03,-1148.09 2226.93,-1147.99"/>
</g>
<!-- webp&#45;&gt;vp8_frame -->
<g id="edge93" class="edge">
@ -1292,17 +1306,23 @@
<path fill="none" stroke="black" d="M661,-588C615.62,-588 670.51,-417.65 639,-385 600.18,-344.77 442.37,-368.56 390,-349 383.04,-346.4 376.03,-342.7 369.59,-338.74"/>
<polygon fill="black" stroke="black" points="370.56,-336.45 363.35,-334.72 367.91,-340.57 370.56,-336.45"/>
</g>
<!-- zip&#45;&gt;probe -->
<g id="edge94" class="edge">
<title>zip:probe&#45;&gt;probe</title>
<path fill="none" stroke="black" d="M2503,-1404C2469.96,-1404 2502.89,-1450.26 2481,-1475 2455.17,-1504.2 2436.31,-1494.48 2401,-1511 2400.19,-1511.38 2399.36,-1511.77 2398.53,-1512.16"/>
<polygon fill="black" stroke="black" points="2397.35,-1510.01 2392.09,-1515.23 2399.46,-1514.43 2397.35,-1510.01"/>
</g>
<!-- dns -->
<g id="node66" class="node">
<g id="node67" class="node">
<title>dns</title>
<polygon fill="paleturquoise" stroke="transparent" points="2321,-1520 2321,-1539 2345,-1539 2345,-1520 2321,-1520"/>
<text text-anchor="start" x="2323" y="-1525.3" font-family="Times,serif" font-size="14.00">dns</text>
<polygon fill="paleturquoise" stroke="transparent" points="2425,-1520 2425,-1539 2449,-1539 2449,-1520 2425,-1520"/>
<text text-anchor="start" x="2427" y="-1525.3" font-family="Times,serif" font-size="14.00">dns</text>
</g>
<!-- raw -->
<g id="node67" class="node">
<g id="node68" class="node">
<title>raw</title>
<polygon fill="paleturquoise" stroke="transparent" points="2392.5,-1520 2392.5,-1539 2417.5,-1539 2417.5,-1520 2392.5,-1520"/>
<text text-anchor="start" x="2395" y="-1525.3" font-family="Times,serif" font-size="14.00">raw</text>
<polygon fill="paleturquoise" stroke="transparent" points="2496.5,-1520 2496.5,-1539 2521.5,-1539 2521.5,-1520 2496.5,-1520"/>
<text text-anchor="start" x="2499" y="-1525.3" font-family="Times,serif" font-size="14.00">raw</text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 84 KiB

View File

@ -14,6 +14,7 @@ $ fq -n _registry.groups.probe
"tar",
"tiff",
"webp",
"zip",
"mpeg_ts",
"wav",
"mp3",

View File

@ -30,4 +30,5 @@ import (
_ "github.com/wader/fq/format/vpx"
_ "github.com/wader/fq/format/wav"
_ "github.com/wader/fq/format/webp"
_ "github.com/wader/fq/format/zip"
)

View File

@ -80,6 +80,7 @@ const (
VPX_CCR = "vpx_ccr"
WAV = "wav"
WEBP = "webp"
ZIP = "zip"
)
// below are data types used to communicate between formats <FormatName>In/Out

414
format/zip/testdata/test-macos.fqtest vendored Normal file
View File

@ -0,0 +1,414 @@
$ fq -d zip verbose /test-macos.zip
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.: {} /test-macos.zip (zip) 0x0-0x2b5.7 (694)
| | | local_files: [4] 0x0-0x145.7 (326)
| | | [0]: local_file {} 0x0-0x42.7 (67)
0x000|50 4b 03 04 |PK.. | signature: raw bits (valid) 0x0-0x3.7 (4)
0x000| 14 00 | .. | version_needed: 20 0x4-0x5.7 (2)
| | | flags: {} 0x6-0x7.7 (2)
0x000| 00 | . | unused0: 0 0x6-0x6 (0.1)
0x000| 00 | . | strong_encryption: false 0x6.1-0x6.1 (0.1)
0x000| 00 | . | compressed_patched_data: false 0x6.2-0x6.2 (0.1)
0x000| 00 | . | enhanced_deflation: false 0x6.3-0x6.3 (0.1)
0x000| 00 | . | data_descriptor: false 0x6.4-0x6.4 (0.1)
0x000| 00 | . | compression0: false 0x6.5-0x6.5 (0.1)
0x000| 00 | . | compression1: false 0x6.6-0x6.6 (0.1)
0x000| 00 | . | encrypted: false 0x6.7-0x6.7 (0.1)
0x000| 00 | . | reserved0: 0 0x7-0x7.1 (0.2)
0x000| 00 | . | mask_header_values: false 0x7.2-0x7.2 (0.1)
0x000| 00 | . | reserved1: false 0x7.3-0x7.3 (0.1)
0x000| 00 | . | language_encoding: false 0x7.4-0x7.4 (0.1)
0x000| 00 | . | unused1: 0 0x7.5-0x7.7 (0.3)
0x000| 00 00 | .. | compression_method: "None" (0) 0x8-0x9.7 (2)
| | | last_modification_date: {} 0xa-0xb.7 (2)
0x000| ef | . | hours: 29 0xa-0xa.4 (0.5)
0x000| ef 94 | .. | minutes: 60 0xa.5-0xb.2 (0.6)
0x000| 94 | . | seconds: 20 0xb.3-0xb.7 (0.5)
| | | last_modification_time: {} 0xc-0xd.7 (2)
0x000| 71 | q | year: 56 0xc-0xc.6 (0.7)
0x000| 71 53 | qS | month: 10 0xc.7-0xd.2 (0.4)
0x000| 53 | S | day: 19 0xd.3-0xd.7 (0.5)
0x000| 00 00| ..| crc32_uncompressed: 0x0 0xe-0x11.7 (4)
0x010|00 00 |.. |
0x010| 00 00 00 00 | .... | compressed_size: 0 0x12-0x15.7 (4)
0x010| 00 00 00 00 | .... | uncompressed_size: 0 0x16-0x19.7 (4)
0x010| 05 00 | .. | file_name_length: 5 0x1a-0x1b.7 (2)
0x010| 20 00 | . | extra_field_length: 32 0x1c-0x1d.7 (2)
0x010| 74 65| te| file_name: "test/" 0x1e-0x22.7 (5)
0x020|73 74 2f |st/ |
| | | extra_fields: [2] 0x23-0x42.7 (32)
| | | [0]: extra_field {} 0x23-0x33.7 (17)
0x020| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x23-0x24.7 (2)
0x020| 0d 00 | .. | data_size: 13 0x25-0x26.7 (2)
0x020| 07 52 3e 95 61 59 3e 95 61| .R>.aY>.a| data: raw bits 0x27-0x33.7 (13)
0x030|52 3e 95 61 |R>.a |
| | | [1]: extra_field {} 0x34-0x42.7 (15)
0x030| 75 78 | ux | header_id: 0x7875 (UNIX UID/GID) 0x34-0x35.7 (2)
0x030| 0b 00 | .. | data_size: 11 0x36-0x37.7 (2)
0x030| 01 04 f5 01 00 00 04 14| ........| data: raw bits 0x38-0x42.7 (11)
0x040|00 00 00 |... |
| | | uncompressed: raw bits 0x43-NA (0)
| | | [1]: local_file {} 0x43-0x87.7 (69)
0x040| 50 4b 03 04 | PK.. | signature: raw bits (valid) 0x43-0x46.7 (4)
0x040| 14 00 | .. | version_needed: 20 0x47-0x48.7 (2)
| | | flags: {} 0x49-0x4a.7 (2)
0x040| 00 | . | unused0: 0 0x49-0x49 (0.1)
0x040| 00 | . | strong_encryption: false 0x49.1-0x49.1 (0.1)
0x040| 00 | . | compressed_patched_data: false 0x49.2-0x49.2 (0.1)
0x040| 00 | . | enhanced_deflation: false 0x49.3-0x49.3 (0.1)
0x040| 00 | . | data_descriptor: false 0x49.4-0x49.4 (0.1)
0x040| 00 | . | compression0: false 0x49.5-0x49.5 (0.1)
0x040| 00 | . | compression1: false 0x49.6-0x49.6 (0.1)
0x040| 00 | . | encrypted: false 0x49.7-0x49.7 (0.1)
0x040| 00 | . | reserved0: 0 0x4a-0x4a.1 (0.2)
0x040| 00 | . | mask_header_values: false 0x4a.2-0x4a.2 (0.1)
0x040| 00 | . | reserved1: false 0x4a.3-0x4a.3 (0.1)
0x040| 00 | . | language_encoding: false 0x4a.4-0x4a.4 (0.1)
0x040| 00 | . | unused1: 0 0x4a.5-0x4a.7 (0.3)
0x040| 00 00 | .. | compression_method: "None" (0) 0x4b-0x4c.7 (2)
| | | last_modification_date: {} 0x4d-0x4e.7 (2)
0x040| 4c | L | hours: 9 0x4d-0x4d.4 (0.5)
0x040| 4c 90 | L. | minutes: 36 0x4d.5-0x4e.2 (0.6)
0x040| 90 | . | seconds: 16 0x4e.3-0x4e.7 (0.5)
| | | last_modification_time: {} 0x4f-0x50.7 (2)
0x040| 71| q| year: 56 0x4f-0x4f.6 (0.7)
0x040| 71| q| month: 10 0x4f.7-0x50.2 (0.4)
0x050|53 |S |
0x050|53 |S | day: 19 0x50.3-0x50.7 (0.5)
0x050| 00 00 00 00 | .... | crc32_uncompressed: 0x0 0x51-0x54.7 (4)
0x050| 00 00 00 00 | .... | compressed_size: 0 0x55-0x58.7 (4)
0x050| 00 00 00 00 | .... | uncompressed_size: 0 0x59-0x5c.7 (4)
0x050| 07 00 | .. | file_name_length: 7 0x5d-0x5e.7 (2)
0x050| 20| | extra_field_length: 32 0x5f-0x60.7 (2)
0x060|00 |. |
0x060| 74 65 73 74 2f 61 2f | test/a/ | file_name: "test/a/" 0x61-0x67.7 (7)
| | | extra_fields: [2] 0x68-0x87.7 (32)
| | | [0]: extra_field {} 0x68-0x78.7 (17)
0x060| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x68-0x69.7 (2)
0x060| 0d 00 | .. | data_size: 13 0x6a-0x6b.7 (2)
0x060| 07 a0 35 95| ..5.| data: raw bits 0x6c-0x78.7 (13)
0x070|61 a0 35 95 61 a0 35 95 61 |a.5.a.5.a |
| | | [1]: extra_field {} 0x79-0x87.7 (15)
0x070| 75 78 | ux | header_id: 0x7875 (UNIX UID/GID) 0x79-0x7a.7 (2)
0x070| 0b 00 | .. | data_size: 11 0x7b-0x7c.7 (2)
0x070| 01 04 f5| ...| data: raw bits 0x7d-0x87.7 (11)
0x080|01 00 00 04 14 00 00 00 |........ |
| | | uncompressed: raw bits 0x88-NA (0)
| | | [2]: local_file {} 0x88-0xe5.7 (94)
0x080| 50 4b 03 04 | PK.. | signature: raw bits (valid) 0x88-0x8b.7 (4)
0x080| 14 00 | .. | version_needed: 20 0x8c-0x8d.7 (2)
| | | flags: {} 0x8e-0x8f.7 (2)
0x080| 08 | . | unused0: 0 0x8e-0x8e (0.1)
0x080| 08 | . | strong_encryption: false 0x8e.1-0x8e.1 (0.1)
0x080| 08 | . | compressed_patched_data: false 0x8e.2-0x8e.2 (0.1)
0x080| 08 | . | enhanced_deflation: false 0x8e.3-0x8e.3 (0.1)
0x080| 08 | . | data_descriptor: true 0x8e.4-0x8e.4 (0.1)
0x080| 08 | . | compression0: false 0x8e.5-0x8e.5 (0.1)
0x080| 08 | . | compression1: false 0x8e.6-0x8e.6 (0.1)
0x080| 08 | . | encrypted: false 0x8e.7-0x8e.7 (0.1)
0x080| 00| .| reserved0: 0 0x8f-0x8f.1 (0.2)
0x080| 00| .| mask_header_values: false 0x8f.2-0x8f.2 (0.1)
0x080| 00| .| reserved1: false 0x8f.3-0x8f.3 (0.1)
0x080| 00| .| language_encoding: false 0x8f.4-0x8f.4 (0.1)
0x080| 00| .| unused1: 0 0x8f.5-0x8f.7 (0.3)
0x090|08 00 |.. | compression_method: "Deflated" (8) 0x90-0x91.7 (2)
| | | last_modification_date: {} 0x92-0x93.7 (2)
0x090| f3 | . | hours: 30 0x92-0x92.4 (0.5)
0x090| f3 94 | .. | minutes: 28 0x92.5-0x93.2 (0.6)
0x090| 94 | . | seconds: 20 0x93.3-0x93.7 (0.5)
| | | last_modification_time: {} 0x94-0x95.7 (2)
0x090| 71 | q | year: 56 0x94-0x94.6 (0.7)
0x090| 71 53 | qS | month: 10 0x94.7-0x95.2 (0.4)
0x090| 53 | S | day: 19 0x95.3-0x95.7 (0.5)
0x090| 00 00 00 00 | .... | crc32_uncompressed: 0x0 0x96-0x99.7 (4)
0x090| 00 00 00 00 | .... | compressed_size: 0 0x9a-0x9d.7 (4)
0x090| 35 00| 5.| uncompressed_size: 53 0x9e-0xa1.7 (4)
0x0a0|00 00 |.. |
0x0a0| 0a 00 | .. | file_name_length: 10 0xa2-0xa3.7 (2)
0x0a0| 20 00 | . | extra_field_length: 32 0xa4-0xa5.7 (2)
0x0a0| 74 65 73 74 2f 61 2e 74 78 74| test/a.txt| file_name: "test/a.txt" 0xa6-0xaf.7 (10)
| | | extra_fields: [2] 0xb0-0xcf.7 (32)
| | | [0]: extra_field {} 0xb0-0xc0.7 (17)
0x0b0|55 54 |UT | header_id: 0x5455 (extended timestamp) 0xb0-0xb1.7 (2)
0x0b0| 0d 00 | .. | data_size: 13 0xb2-0xb3.7 (2)
0x0b0| 07 5b 3e 95 61 5d 3e 95 61 5b 3e 95| .[>.a]>.a[>.| data: raw bits 0xb4-0xc0.7 (13)
0x0c0|61 |a |
| | | [1]: extra_field {} 0xc1-0xcf.7 (15)
0x0c0| 75 78 | ux | header_id: 0x7875 (UNIX UID/GID) 0xc1-0xc2.7 (2)
0x0c0| 0b 00 | .. | data_size: 11 0xc3-0xc4.7 (2)
0x0c0| 01 04 f5 01 00 00 04 14 00 00 00| ...........| data: raw bits 0xc5-0xcf.7 (11)
0x00|61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61|aaaaaaaaaaaaaaaa| uncompressed: raw bits 0x0-0x34.7 (53)
* |until 0x34.7 (end) (53) | |
0x0d0|4b 4c 24 03 00 00 |KL$... | compressed: raw bits 0xd0-0xd5.7 (6)
| | | data_indicator: {} 0xd6-0xe5.7 (16)
0x0d0| 50 4b 07 08 | PK.. | signature: raw bits (valid) 0xd6-0xd9.7 (4)
0x0d0| 2c 89 b3 aa | ,... | crc32_uncompressed: 0xaab3892c 0xda-0xdd.7 (4)
0x0d0| 06 00| ..| compressed_size: 6 0xde-0xe1.7 (4)
0x0e0|00 00 |.. |
0x0e0| 35 00 00 00 | 5... | uncompressed_size: 53 0xe2-0xe5.7 (4)
| | | [3]: local_file {} 0xe6-0x145.7 (96)
0x0e0| 50 4b 03 04 | PK.. | signature: raw bits (valid) 0xe6-0xe9.7 (4)
0x0e0| 14 00 | .. | version_needed: 20 0xea-0xeb.7 (2)
| | | flags: {} 0xec-0xed.7 (2)
0x0e0| 08 | . | unused0: 0 0xec-0xec (0.1)
0x0e0| 08 | . | strong_encryption: false 0xec.1-0xec.1 (0.1)
0x0e0| 08 | . | compressed_patched_data: false 0xec.2-0xec.2 (0.1)
0x0e0| 08 | . | enhanced_deflation: false 0xec.3-0xec.3 (0.1)
0x0e0| 08 | . | data_descriptor: true 0xec.4-0xec.4 (0.1)
0x0e0| 08 | . | compression0: false 0xec.5-0xec.5 (0.1)
0x0e0| 08 | . | compression1: false 0xec.6-0xec.6 (0.1)
0x0e0| 08 | . | encrypted: false 0xec.7-0xec.7 (0.1)
0x0e0| 00 | . | reserved0: 0 0xed-0xed.1 (0.2)
0x0e0| 00 | . | mask_header_values: false 0xed.2-0xed.2 (0.1)
0x0e0| 00 | . | reserved1: false 0xed.3-0xed.3 (0.1)
0x0e0| 00 | . | language_encoding: false 0xed.4-0xed.4 (0.1)
0x0e0| 00 | . | unused1: 0 0xed.5-0xed.7 (0.3)
0x0e0| 08 00| ..| compression_method: "Deflated" (8) 0xee-0xef.7 (2)
| | | last_modification_date: {} 0xf0-0xf1.7 (2)
0x0f0|4c |L | hours: 9 0xf0-0xf0.4 (0.5)
0x0f0|4c 90 |L. | minutes: 36 0xf0.5-0xf1.2 (0.6)
0x0f0| 90 | . | seconds: 16 0xf1.3-0xf1.7 (0.5)
| | | last_modification_time: {} 0xf2-0xf3.7 (2)
0x0f0| 71 | q | year: 56 0xf2-0xf2.6 (0.7)
0x0f0| 71 53 | qS | month: 10 0xf2.7-0xf3.2 (0.4)
0x0f0| 53 | S | day: 19 0xf3.3-0xf3.7 (0.5)
0x0f0| 00 00 00 00 | .... | crc32_uncompressed: 0x0 0xf4-0xf7.7 (4)
0x0f0| 00 00 00 00 | .... | compressed_size: 0 0xf8-0xfb.7 (4)
0x0f0| 04 00 00 00| ....| uncompressed_size: 4 0xfc-0xff.7 (4)
0x100|0c 00 |.. | file_name_length: 12 0x100-0x101.7 (2)
0x100| 20 00 | . | extra_field_length: 32 0x102-0x103.7 (2)
0x100| 74 65 73 74 2f 61 2f 61 2e 74 78 74| test/a/a.txt| file_name: "test/a/a.txt" 0x104-0x10f.7 (12)
| | | extra_fields: [2] 0x110-0x12f.7 (32)
| | | [0]: extra_field {} 0x110-0x120.7 (17)
0x110|55 54 |UT | header_id: 0x5455 (extended timestamp) 0x110-0x111.7 (2)
0x110| 0d 00 | .. | data_size: 13 0x112-0x113.7 (2)
0x110| 07 a0 35 95 61 a1 35 95 61 a0 35 95| ..5.a.5.a.5.| data: raw bits 0x114-0x120.7 (13)
0x120|61 |a |
| | | [1]: extra_field {} 0x121-0x12f.7 (15)
0x120| 75 78 | ux | header_id: 0x7875 (UNIX UID/GID) 0x121-0x122.7 (2)
0x120| 0b 00 | .. | data_size: 11 0x123-0x124.7 (2)
0x120| 01 04 f5 01 00 00 04 14 00 00 00| ...........| data: raw bits 0x125-0x12f.7 (11)
0x00|61 61 61 61| |aaaa| | uncompressed: raw bits 0x0-0x3.7 (4)
0x130|4b 4c 4c 4c 04 00 |KLLL.. | compressed: raw bits 0x130-0x135.7 (6)
| | | data_indicator: {} 0x136-0x145.7 (16)
0x130| 50 4b 07 08 | PK.. | signature: raw bits (valid) 0x136-0x139.7 (4)
0x130| 45 e5 98 ad | E... | crc32_uncompressed: 0xad98e545 0x13a-0x13d.7 (4)
0x130| 06 00| ..| compressed_size: 6 0x13e-0x141.7 (4)
0x140|00 00 |.. |
0x140| 04 00 00 00 | .... | uncompressed_size: 4 0x142-0x145.7 (4)
| | | central_directories: [4] 0x146-0x29f.7 (346)
| | | [0]: central_directory {} 0x146-0x198.7 (83)
0x140| 50 4b 01 02 | PK.. | signature: raw bits (valid) 0x146-0x149.7 (4)
0x140| 14 03 | .. | version_made_by: 788 0x14a-0x14b.7 (2)
0x140| 14 00 | .. | version_needed: 20 0x14c-0x14d.7 (2)
| | | flags: {} 0x14e-0x14f.7 (2)
0x140| 00 | . | unused0: 0 0x14e-0x14e (0.1)
0x140| 00 | . | strong_encryption: false 0x14e.1-0x14e.1 (0.1)
0x140| 00 | . | compressed_patched_data: false 0x14e.2-0x14e.2 (0.1)
0x140| 00 | . | enhanced_deflation: false 0x14e.3-0x14e.3 (0.1)
0x140| 00 | . | data_descriptor: false 0x14e.4-0x14e.4 (0.1)
0x140| 00 | . | compression0: false 0x14e.5-0x14e.5 (0.1)
0x140| 00 | . | compression1: false 0x14e.6-0x14e.6 (0.1)
0x140| 00 | . | encrypted: false 0x14e.7-0x14e.7 (0.1)
0x140| 00| .| reserved0: 0 0x14f-0x14f.1 (0.2)
0x140| 00| .| mask_header_values: false 0x14f.2-0x14f.2 (0.1)
0x140| 00| .| reserved1: false 0x14f.3-0x14f.3 (0.1)
0x140| 00| .| language_encoding: false 0x14f.4-0x14f.4 (0.1)
0x140| 00| .| unused1: 0 0x14f.5-0x14f.7 (0.3)
0x150|00 00 |.. | compression_method: "None" (0) 0x150-0x151.7 (2)
| | | last_modification_date: {} 0x152-0x153.7 (2)
0x150| ef | . | hours: 29 0x152-0x152.4 (0.5)
0x150| ef 94 | .. | minutes: 60 0x152.5-0x153.2 (0.6)
0x150| 94 | . | seconds: 20 0x153.3-0x153.7 (0.5)
| | | last_modification_time: {} 0x154-0x155.7 (2)
0x150| 71 | q | year: 56 0x154-0x154.6 (0.7)
0x150| 71 53 | qS | month: 10 0x154.7-0x155.2 (0.4)
0x150| 53 | S | day: 19 0x155.3-0x155.7 (0.5)
0x150| 00 00 00 00 | .... | crc32_uncompressed: 0x0 0x156-0x159.7 (4)
0x150| 00 00 00 00 | .... | compressed_size: 0 0x15a-0x15d.7 (4)
0x150| 00 00| ..| uncompressed_size: 0 0x15e-0x161.7 (4)
0x160|00 00 |.. |
0x160| 05 00 | .. | file_name_length: 5 0x162-0x163.7 (2)
0x160| 20 00 | . | extra_field_length: 32 0x164-0x165.7 (2)
0x160| 00 00 | .. | file_comment_length: 0 0x166-0x167.7 (2)
0x160| 00 00 | .. | disk_number_where_file_starts: 0 0x168-0x169.7 (2)
0x160| 00 00 | .. | internal_file_attributes: 0 0x16a-0x16b.7 (2)
0x160| 00 00 ed 41| ...A| external_file_attributes: 1106051072 0x16c-0x16f.7 (4)
0x170|00 00 00 00 |.... | relative_offset_of_local_file_header: 0 0x170-0x173.7 (4)
0x170| 74 65 73 74 2f | test/ | file_name: "test/" 0x174-0x178.7 (5)
| | | extra_fields: [2] 0x179-0x198.7 (32)
| | | [0]: extra_field {} 0x179-0x189.7 (17)
0x170| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x179-0x17a.7 (2)
0x170| 0d 00 | .. | data_size: 13 0x17b-0x17c.7 (2)
0x170| 07 52 3e| .R>| data: raw bits 0x17d-0x189.7 (13)
0x180|95 61 59 3e 95 61 52 3e 95 61 |.aY>.aR>.a |
| | | [1]: extra_field {} 0x18a-0x198.7 (15)
0x180| 75 78 | ux | header_id: 0x7875 (UNIX UID/GID) 0x18a-0x18b.7 (2)
0x180| 0b 00 | .. | data_size: 11 0x18c-0x18d.7 (2)
0x180| 01 04| ..| data: raw bits 0x18e-0x198.7 (11)
0x190|f5 01 00 00 04 14 00 00 00 |......... |
| | | file_comment: "" 0x199-NA (0)
| | | [1]: central_directory {} 0x199-0x1ed.7 (85)
0x190| 50 4b 01 02 | PK.. | signature: raw bits (valid) 0x199-0x19c.7 (4)
0x190| 14 03 | .. | version_made_by: 788 0x19d-0x19e.7 (2)
0x190| 14| .| version_needed: 20 0x19f-0x1a0.7 (2)
0x1a0|00 |. |
| | | flags: {} 0x1a1-0x1a2.7 (2)
0x1a0| 00 | . | unused0: 0 0x1a1-0x1a1 (0.1)
0x1a0| 00 | . | strong_encryption: false 0x1a1.1-0x1a1.1 (0.1)
0x1a0| 00 | . | compressed_patched_data: false 0x1a1.2-0x1a1.2 (0.1)
0x1a0| 00 | . | enhanced_deflation: false 0x1a1.3-0x1a1.3 (0.1)
0x1a0| 00 | . | data_descriptor: false 0x1a1.4-0x1a1.4 (0.1)
0x1a0| 00 | . | compression0: false 0x1a1.5-0x1a1.5 (0.1)
0x1a0| 00 | . | compression1: false 0x1a1.6-0x1a1.6 (0.1)
0x1a0| 00 | . | encrypted: false 0x1a1.7-0x1a1.7 (0.1)
0x1a0| 00 | . | reserved0: 0 0x1a2-0x1a2.1 (0.2)
0x1a0| 00 | . | mask_header_values: false 0x1a2.2-0x1a2.2 (0.1)
0x1a0| 00 | . | reserved1: false 0x1a2.3-0x1a2.3 (0.1)
0x1a0| 00 | . | language_encoding: false 0x1a2.4-0x1a2.4 (0.1)
0x1a0| 00 | . | unused1: 0 0x1a2.5-0x1a2.7 (0.3)
0x1a0| 00 00 | .. | compression_method: "None" (0) 0x1a3-0x1a4.7 (2)
| | | last_modification_date: {} 0x1a5-0x1a6.7 (2)
0x1a0| 4c | L | hours: 9 0x1a5-0x1a5.4 (0.5)
0x1a0| 4c 90 | L. | minutes: 36 0x1a5.5-0x1a6.2 (0.6)
0x1a0| 90 | . | seconds: 16 0x1a6.3-0x1a6.7 (0.5)
| | | last_modification_time: {} 0x1a7-0x1a8.7 (2)
0x1a0| 71 | q | year: 56 0x1a7-0x1a7.6 (0.7)
0x1a0| 71 53 | qS | month: 10 0x1a7.7-0x1a8.2 (0.4)
0x1a0| 53 | S | day: 19 0x1a8.3-0x1a8.7 (0.5)
0x1a0| 00 00 00 00 | .... | crc32_uncompressed: 0x0 0x1a9-0x1ac.7 (4)
0x1a0| 00 00 00| ...| compressed_size: 0 0x1ad-0x1b0.7 (4)
0x1b0|00 |. |
0x1b0| 00 00 00 00 | .... | uncompressed_size: 0 0x1b1-0x1b4.7 (4)
0x1b0| 07 00 | .. | file_name_length: 7 0x1b5-0x1b6.7 (2)
0x1b0| 20 00 | . | extra_field_length: 32 0x1b7-0x1b8.7 (2)
0x1b0| 00 00 | .. | file_comment_length: 0 0x1b9-0x1ba.7 (2)
0x1b0| 00 00 | .. | disk_number_where_file_starts: 0 0x1bb-0x1bc.7 (2)
0x1b0| 00 00 | .. | internal_file_attributes: 0 0x1bd-0x1be.7 (2)
0x1b0| 00| .| external_file_attributes: 1106051072 0x1bf-0x1c2.7 (4)
0x1c0|00 ed 41 |..A |
0x1c0| 43 00 00 00 | C... | relative_offset_of_local_file_header: 67 0x1c3-0x1c6.7 (4)
0x1c0| 74 65 73 74 2f 61 2f | test/a/ | file_name: "test/a/" 0x1c7-0x1cd.7 (7)
| | | extra_fields: [2] 0x1ce-0x1ed.7 (32)
| | | [0]: extra_field {} 0x1ce-0x1de.7 (17)
0x1c0| 55 54| UT| header_id: 0x5455 (extended timestamp) 0x1ce-0x1cf.7 (2)
0x1d0|0d 00 |.. | data_size: 13 0x1d0-0x1d1.7 (2)
0x1d0| 07 a0 35 95 61 a0 35 95 61 a0 35 95 61 | ..5.a.5.a.5.a | data: raw bits 0x1d2-0x1de.7 (13)
| | | [1]: extra_field {} 0x1df-0x1ed.7 (15)
0x1d0| 75| u| header_id: 0x7875 (UNIX UID/GID) 0x1df-0x1e0.7 (2)
0x1e0|78 |x |
0x1e0| 0b 00 | .. | data_size: 11 0x1e1-0x1e2.7 (2)
0x1e0| 01 04 f5 01 00 00 04 14 00 00 00 | ........... | data: raw bits 0x1e3-0x1ed.7 (11)
| | | file_comment: "" 0x1ee-NA (0)
| | | [2]: central_directory {} 0x1ee-0x245.7 (88)
0x1e0| 50 4b| PK| signature: raw bits (valid) 0x1ee-0x1f1.7 (4)
0x1f0|01 02 |.. |
0x1f0| 14 03 | .. | version_made_by: 788 0x1f2-0x1f3.7 (2)
0x1f0| 14 00 | .. | version_needed: 20 0x1f4-0x1f5.7 (2)
| | | flags: {} 0x1f6-0x1f7.7 (2)
0x1f0| 08 | . | unused0: 0 0x1f6-0x1f6 (0.1)
0x1f0| 08 | . | strong_encryption: false 0x1f6.1-0x1f6.1 (0.1)
0x1f0| 08 | . | compressed_patched_data: false 0x1f6.2-0x1f6.2 (0.1)
0x1f0| 08 | . | enhanced_deflation: false 0x1f6.3-0x1f6.3 (0.1)
0x1f0| 08 | . | data_descriptor: true 0x1f6.4-0x1f6.4 (0.1)
0x1f0| 08 | . | compression0: false 0x1f6.5-0x1f6.5 (0.1)
0x1f0| 08 | . | compression1: false 0x1f6.6-0x1f6.6 (0.1)
0x1f0| 08 | . | encrypted: false 0x1f6.7-0x1f6.7 (0.1)
0x1f0| 00 | . | reserved0: 0 0x1f7-0x1f7.1 (0.2)
0x1f0| 00 | . | mask_header_values: false 0x1f7.2-0x1f7.2 (0.1)
0x1f0| 00 | . | reserved1: false 0x1f7.3-0x1f7.3 (0.1)
0x1f0| 00 | . | language_encoding: false 0x1f7.4-0x1f7.4 (0.1)
0x1f0| 00 | . | unused1: 0 0x1f7.5-0x1f7.7 (0.3)
0x1f0| 08 00 | .. | compression_method: "Deflated" (8) 0x1f8-0x1f9.7 (2)
| | | last_modification_date: {} 0x1fa-0x1fb.7 (2)
0x1f0| f3 | . | hours: 30 0x1fa-0x1fa.4 (0.5)
0x1f0| f3 94 | .. | minutes: 28 0x1fa.5-0x1fb.2 (0.6)
0x1f0| 94 | . | seconds: 20 0x1fb.3-0x1fb.7 (0.5)
| | | last_modification_time: {} 0x1fc-0x1fd.7 (2)
0x1f0| 71 | q | year: 56 0x1fc-0x1fc.6 (0.7)
0x1f0| 71 53 | qS | month: 10 0x1fc.7-0x1fd.2 (0.4)
0x1f0| 53 | S | day: 19 0x1fd.3-0x1fd.7 (0.5)
0x1f0| 2c 89| ,.| crc32_uncompressed: 0xaab3892c 0x1fe-0x201.7 (4)
0x200|b3 aa |.. |
0x200| 06 00 00 00 | .... | compressed_size: 6 0x202-0x205.7 (4)
0x200| 35 00 00 00 | 5... | uncompressed_size: 53 0x206-0x209.7 (4)
0x200| 0a 00 | .. | file_name_length: 10 0x20a-0x20b.7 (2)
0x200| 20 00 | . | extra_field_length: 32 0x20c-0x20d.7 (2)
0x200| 00 00| ..| file_comment_length: 0 0x20e-0x20f.7 (2)
0x210|00 00 |.. | disk_number_where_file_starts: 0 0x210-0x211.7 (2)
0x210| 00 00 | .. | internal_file_attributes: 0 0x212-0x213.7 (2)
0x210| 00 00 a4 81 | .... | external_file_attributes: 2175008768 0x214-0x217.7 (4)
0x210| 88 00 00 00 | .... | relative_offset_of_local_file_header: 136 0x218-0x21b.7 (4)
0x210| 74 65 73 74| test| file_name: "test/a.txt" 0x21c-0x225.7 (10)
0x220|2f 61 2e 74 78 74 |/a.txt |
| | | extra_fields: [2] 0x226-0x245.7 (32)
| | | [0]: extra_field {} 0x226-0x236.7 (17)
0x220| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x226-0x227.7 (2)
0x220| 0d 00 | .. | data_size: 13 0x228-0x229.7 (2)
0x220| 07 5b 3e 95 61 5d| .[>.a]| data: raw bits 0x22a-0x236.7 (13)
0x230|3e 95 61 5b 3e 95 61 |>.a[>.a |
| | | [1]: extra_field {} 0x237-0x245.7 (15)
0x230| 75 78 | ux | header_id: 0x7875 (UNIX UID/GID) 0x237-0x238.7 (2)
0x230| 0b 00 | .. | data_size: 11 0x239-0x23a.7 (2)
0x230| 01 04 f5 01 00| .....| data: raw bits 0x23b-0x245.7 (11)
0x240|00 04 14 00 00 00 |...... |
| | | file_comment: "" 0x246-NA (0)
| | | [3]: central_directory {} 0x246-0x29f.7 (90)
0x240| 50 4b 01 02 | PK.. | signature: raw bits (valid) 0x246-0x249.7 (4)
0x240| 14 03 | .. | version_made_by: 788 0x24a-0x24b.7 (2)
0x240| 14 00 | .. | version_needed: 20 0x24c-0x24d.7 (2)
| | | flags: {} 0x24e-0x24f.7 (2)
0x240| 08 | . | unused0: 0 0x24e-0x24e (0.1)
0x240| 08 | . | strong_encryption: false 0x24e.1-0x24e.1 (0.1)
0x240| 08 | . | compressed_patched_data: false 0x24e.2-0x24e.2 (0.1)
0x240| 08 | . | enhanced_deflation: false 0x24e.3-0x24e.3 (0.1)
0x240| 08 | . | data_descriptor: true 0x24e.4-0x24e.4 (0.1)
0x240| 08 | . | compression0: false 0x24e.5-0x24e.5 (0.1)
0x240| 08 | . | compression1: false 0x24e.6-0x24e.6 (0.1)
0x240| 08 | . | encrypted: false 0x24e.7-0x24e.7 (0.1)
0x240| 00| .| reserved0: 0 0x24f-0x24f.1 (0.2)
0x240| 00| .| mask_header_values: false 0x24f.2-0x24f.2 (0.1)
0x240| 00| .| reserved1: false 0x24f.3-0x24f.3 (0.1)
0x240| 00| .| language_encoding: false 0x24f.4-0x24f.4 (0.1)
0x240| 00| .| unused1: 0 0x24f.5-0x24f.7 (0.3)
0x250|08 00 |.. | compression_method: "Deflated" (8) 0x250-0x251.7 (2)
| | | last_modification_date: {} 0x252-0x253.7 (2)
0x250| 4c | L | hours: 9 0x252-0x252.4 (0.5)
0x250| 4c 90 | L. | minutes: 36 0x252.5-0x253.2 (0.6)
0x250| 90 | . | seconds: 16 0x253.3-0x253.7 (0.5)
| | | last_modification_time: {} 0x254-0x255.7 (2)
0x250| 71 | q | year: 56 0x254-0x254.6 (0.7)
0x250| 71 53 | qS | month: 10 0x254.7-0x255.2 (0.4)
0x250| 53 | S | day: 19 0x255.3-0x255.7 (0.5)
0x250| 45 e5 98 ad | E... | crc32_uncompressed: 0xad98e545 0x256-0x259.7 (4)
0x250| 06 00 00 00 | .... | compressed_size: 6 0x25a-0x25d.7 (4)
0x250| 04 00| ..| uncompressed_size: 4 0x25e-0x261.7 (4)
0x260|00 00 |.. |
0x260| 0c 00 | .. | file_name_length: 12 0x262-0x263.7 (2)
0x260| 20 00 | . | extra_field_length: 32 0x264-0x265.7 (2)
0x260| 00 00 | .. | file_comment_length: 0 0x266-0x267.7 (2)
0x260| 00 00 | .. | disk_number_where_file_starts: 0 0x268-0x269.7 (2)
0x260| 00 00 | .. | internal_file_attributes: 0 0x26a-0x26b.7 (2)
0x260| 00 00 a4 81| ....| external_file_attributes: 2175008768 0x26c-0x26f.7 (4)
0x270|e6 00 00 00 |.... | relative_offset_of_local_file_header: 230 0x270-0x273.7 (4)
0x270| 74 65 73 74 2f 61 2f 61 2e 74 78 74| test/a/a.txt| file_name: "test/a/a.txt" 0x274-0x27f.7 (12)
| | | extra_fields: [2] 0x280-0x29f.7 (32)
| | | [0]: extra_field {} 0x280-0x290.7 (17)
0x280|55 54 |UT | header_id: 0x5455 (extended timestamp) 0x280-0x281.7 (2)
0x280| 0d 00 | .. | data_size: 13 0x282-0x283.7 (2)
0x280| 07 a0 35 95 61 a1 35 95 61 a0 35 95| ..5.a.5.a.5.| data: raw bits 0x284-0x290.7 (13)
0x290|61 |a |
| | | [1]: extra_field {} 0x291-0x29f.7 (15)
0x290| 75 78 | ux | header_id: 0x7875 (UNIX UID/GID) 0x291-0x292.7 (2)
0x290| 0b 00 | .. | data_size: 11 0x293-0x294.7 (2)
0x290| 01 04 f5 01 00 00 04 14 00 00 00| ...........| data: raw bits 0x295-0x29f.7 (11)
| | | file_comment: "" 0x2a0-NA (0)
| | | end_of_central_directory: {} 0x2a0-0x2b5.7 (22)
0x2a0|50 4b 05 06 |PK.. | signature: raw bits (valid) 0x2a0-0x2a3.7 (4)
0x2a0| 00 00 | .. | disk_nr: 0 0x2a4-0x2a5.7 (2)
0x2a0| 00 00 | .. | central_directory_start_disk_nr: 0 0x2a6-0x2a7.7 (2)
0x2a0| 04 00 | .. | nr_of_central_directory_records_on_disk: 4 0x2a8-0x2a9.7 (2)
0x2a0| 04 00 | .. | nr_of_central_directory_records: 4 0x2aa-0x2ab.7 (2)
0x2a0| 5a 01 00 00| Z...| size_of_central directory: 346 0x2ac-0x2af.7 (4)
0x2b0|46 01 00 00 |F... | offset_of_start_of_central_directory: 326 0x2b0-0x2b3.7 (4)
0x2b0| 00 00| | ..| | comment_length: 0 0x2b4-0x2b5.7 (2)
| | | comment: "" 0x2b6-NA (0)

BIN
format/zip/testdata/test-macos.zip vendored Normal file

Binary file not shown.

1
format/zip/testdata/test/a.txt vendored Normal file
View File

@ -0,0 +1 @@
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

1
format/zip/testdata/test/a/a.txt vendored Normal file
View File

@ -0,0 +1 @@
aaaa

405
format/zip/testdata/test0.fqtest vendored Normal file
View File

@ -0,0 +1,405 @@
$ fq -d zip verbose /test0.zip
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.: {} /test0.zip (zip) 0x0-0x292.7 (659)
| | | local_files: [4] 0x0-0x142.7 (323)
| | | [0]: local_file {} 0x0-0x3e.7 (63)
0x000|50 4b 03 04 |PK.. | signature: raw bits (valid) 0x0-0x3.7 (4)
0x000| 0a 00 | .. | version_needed: 10 0x4-0x5.7 (2)
| | | flags: {} 0x6-0x7.7 (2)
0x000| 00 | . | unused0: 0 0x6-0x6 (0.1)
0x000| 00 | . | strong_encryption: false 0x6.1-0x6.1 (0.1)
0x000| 00 | . | compressed_patched_data: false 0x6.2-0x6.2 (0.1)
0x000| 00 | . | enhanced_deflation: false 0x6.3-0x6.3 (0.1)
0x000| 00 | . | data_descriptor: false 0x6.4-0x6.4 (0.1)
0x000| 00 | . | compression0: false 0x6.5-0x6.5 (0.1)
0x000| 00 | . | compression1: false 0x6.6-0x6.6 (0.1)
0x000| 00 | . | encrypted: false 0x6.7-0x6.7 (0.1)
0x000| 00 | . | reserved0: 0 0x7-0x7.1 (0.2)
0x000| 00 | . | mask_header_values: false 0x7.2-0x7.2 (0.1)
0x000| 00 | . | reserved1: false 0x7.3-0x7.3 (0.1)
0x000| 00 | . | language_encoding: false 0x7.4-0x7.4 (0.1)
0x000| 00 | . | unused1: 0 0x7.5-0x7.7 (0.3)
0x000| 00 00 | .. | compression_method: "None" (0) 0x8-0x9.7 (2)
| | | last_modification_date: {} 0xa-0xb.7 (2)
0x000| ef | . | hours: 29 0xa-0xa.4 (0.5)
0x000| ef 94 | .. | minutes: 60 0xa.5-0xb.2 (0.6)
0x000| 94 | . | seconds: 20 0xb.3-0xb.7 (0.5)
| | | last_modification_time: {} 0xc-0xd.7 (2)
0x000| 71 | q | year: 56 0xc-0xc.6 (0.7)
0x000| 71 53 | qS | month: 10 0xc.7-0xd.2 (0.4)
0x000| 53 | S | day: 19 0xd.3-0xd.7 (0.5)
0x000| 00 00| ..| crc32_uncompressed: 0x0 0xe-0x11.7 (4)
0x010|00 00 |.. |
0x010| 00 00 00 00 | .... | compressed_size: 0 0x12-0x15.7 (4)
0x010| 00 00 00 00 | .... | uncompressed_size: 0 0x16-0x19.7 (4)
0x010| 05 00 | .. | file_name_length: 5 0x1a-0x1b.7 (2)
0x010| 1c 00 | .. | extra_field_length: 28 0x1c-0x1d.7 (2)
0x010| 74 65| te| file_name: "test/" 0x1e-0x22.7 (5)
0x020|73 74 2f |st/ |
| | | extra_fields: [2] 0x23-0x3e.7 (28)
| | | [0]: extra_field {} 0x23-0x2f.7 (13)
0x020| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x23-0x24.7 (2)
0x020| 09 00 | .. | data_size: 9 0x25-0x26.7 (2)
0x020| 03 52 3e 95 61 59 3e 95 61| .R>.aY>.a| data: raw bits 0x27-0x2f.7 (9)
| | | [1]: extra_field {} 0x30-0x3e.7 (15)
0x030|75 78 |ux | header_id: 0x7875 (UNIX UID/GID) 0x30-0x31.7 (2)
0x030| 0b 00 | .. | data_size: 11 0x32-0x33.7 (2)
0x030| 01 04 f5 01 00 00 04 14 00 00 00 | ........... | data: raw bits 0x34-0x3e.7 (11)
| | | uncompressed: raw bits 0x3f-NA (0)
| | | [1]: local_file {} 0x3f-0x7f.7 (65)
0x030| 50| P| signature: raw bits (valid) 0x3f-0x42.7 (4)
0x040|4b 03 04 |K.. |
0x040| 0a 00 | .. | version_needed: 10 0x43-0x44.7 (2)
| | | flags: {} 0x45-0x46.7 (2)
0x040| 00 | . | unused0: 0 0x45-0x45 (0.1)
0x040| 00 | . | strong_encryption: false 0x45.1-0x45.1 (0.1)
0x040| 00 | . | compressed_patched_data: false 0x45.2-0x45.2 (0.1)
0x040| 00 | . | enhanced_deflation: false 0x45.3-0x45.3 (0.1)
0x040| 00 | . | data_descriptor: false 0x45.4-0x45.4 (0.1)
0x040| 00 | . | compression0: false 0x45.5-0x45.5 (0.1)
0x040| 00 | . | compression1: false 0x45.6-0x45.6 (0.1)
0x040| 00 | . | encrypted: false 0x45.7-0x45.7 (0.1)
0x040| 00 | . | reserved0: 0 0x46-0x46.1 (0.2)
0x040| 00 | . | mask_header_values: false 0x46.2-0x46.2 (0.1)
0x040| 00 | . | reserved1: false 0x46.3-0x46.3 (0.1)
0x040| 00 | . | language_encoding: false 0x46.4-0x46.4 (0.1)
0x040| 00 | . | unused1: 0 0x46.5-0x46.7 (0.3)
0x040| 00 00 | .. | compression_method: "None" (0) 0x47-0x48.7 (2)
| | | last_modification_date: {} 0x49-0x4a.7 (2)
0x040| 4c | L | hours: 9 0x49-0x49.4 (0.5)
0x040| 4c 90 | L. | minutes: 36 0x49.5-0x4a.2 (0.6)
0x040| 90 | . | seconds: 16 0x4a.3-0x4a.7 (0.5)
| | | last_modification_time: {} 0x4b-0x4c.7 (2)
0x040| 71 | q | year: 56 0x4b-0x4b.6 (0.7)
0x040| 71 53 | qS | month: 10 0x4b.7-0x4c.2 (0.4)
0x040| 53 | S | day: 19 0x4c.3-0x4c.7 (0.5)
0x040| 00 00 00| ...| crc32_uncompressed: 0x0 0x4d-0x50.7 (4)
0x050|00 |. |
0x050| 00 00 00 00 | .... | compressed_size: 0 0x51-0x54.7 (4)
0x050| 00 00 00 00 | .... | uncompressed_size: 0 0x55-0x58.7 (4)
0x050| 07 00 | .. | file_name_length: 7 0x59-0x5a.7 (2)
0x050| 1c 00 | .. | extra_field_length: 28 0x5b-0x5c.7 (2)
0x050| 74 65 73| tes| file_name: "test/a/" 0x5d-0x63.7 (7)
0x060|74 2f 61 2f |t/a/ |
| | | extra_fields: [2] 0x64-0x7f.7 (28)
| | | [0]: extra_field {} 0x64-0x70.7 (13)
0x060| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x64-0x65.7 (2)
0x060| 09 00 | .. | data_size: 9 0x66-0x67.7 (2)
0x060| 03 a0 35 95 61 a0 35 95| ..5.a.5.| data: raw bits 0x68-0x70.7 (9)
0x070|61 |a |
| | | [1]: extra_field {} 0x71-0x7f.7 (15)
0x070| 75 78 | ux | header_id: 0x7875 (UNIX UID/GID) 0x71-0x72.7 (2)
0x070| 0b 00 | .. | data_size: 11 0x73-0x74.7 (2)
0x070| 01 04 f5 01 00 00 04 14 00 00 00| ...........| data: raw bits 0x75-0x7f.7 (11)
| | | uncompressed: raw bits 0x80-NA (0)
| | | [2]: local_file {} 0x80-0xc9.7 (74)
0x080|50 4b 03 04 |PK.. | signature: raw bits (valid) 0x80-0x83.7 (4)
0x080| 0a 00 | .. | version_needed: 10 0x84-0x85.7 (2)
| | | flags: {} 0x86-0x87.7 (2)
0x080| 00 | . | unused0: 0 0x86-0x86 (0.1)
0x080| 00 | . | strong_encryption: false 0x86.1-0x86.1 (0.1)
0x080| 00 | . | compressed_patched_data: false 0x86.2-0x86.2 (0.1)
0x080| 00 | . | enhanced_deflation: false 0x86.3-0x86.3 (0.1)
0x080| 00 | . | data_descriptor: false 0x86.4-0x86.4 (0.1)
0x080| 00 | . | compression0: false 0x86.5-0x86.5 (0.1)
0x080| 00 | . | compression1: false 0x86.6-0x86.6 (0.1)
0x080| 00 | . | encrypted: false 0x86.7-0x86.7 (0.1)
0x080| 00 | . | reserved0: 0 0x87-0x87.1 (0.2)
0x080| 00 | . | mask_header_values: false 0x87.2-0x87.2 (0.1)
0x080| 00 | . | reserved1: false 0x87.3-0x87.3 (0.1)
0x080| 00 | . | language_encoding: false 0x87.4-0x87.4 (0.1)
0x080| 00 | . | unused1: 0 0x87.5-0x87.7 (0.3)
0x080| 00 00 | .. | compression_method: "None" (0) 0x88-0x89.7 (2)
| | | last_modification_date: {} 0x8a-0x8b.7 (2)
0x080| 4c | L | hours: 9 0x8a-0x8a.4 (0.5)
0x080| 4c 90 | L. | minutes: 36 0x8a.5-0x8b.2 (0.6)
0x080| 90 | . | seconds: 16 0x8b.3-0x8b.7 (0.5)
| | | last_modification_time: {} 0x8c-0x8d.7 (2)
0x080| 71 | q | year: 56 0x8c-0x8c.6 (0.7)
0x080| 71 53 | qS | month: 10 0x8c.7-0x8d.2 (0.4)
0x080| 53 | S | day: 19 0x8d.3-0x8d.7 (0.5)
0x080| 45 e5| E.| crc32_uncompressed: 0xad98e545 0x8e-0x91.7 (4)
0x090|98 ad |.. |
0x090| 04 00 00 00 | .... | compressed_size: 4 0x92-0x95.7 (4)
0x090| 04 00 00 00 | .... | uncompressed_size: 4 0x96-0x99.7 (4)
0x090| 0c 00 | .. | file_name_length: 12 0x9a-0x9b.7 (2)
0x090| 1c 00 | .. | extra_field_length: 28 0x9c-0x9d.7 (2)
0x090| 74 65| te| file_name: "test/a/a.txt" 0x9e-0xa9.7 (12)
0x0a0|73 74 2f 61 2f 61 2e 74 78 74 |st/a/a.txt |
| | | extra_fields: [2] 0xaa-0xc5.7 (28)
| | | [0]: extra_field {} 0xaa-0xb6.7 (13)
0x0a0| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0xaa-0xab.7 (2)
0x0a0| 09 00 | .. | data_size: 9 0xac-0xad.7 (2)
0x0a0| 03 a0| ..| data: raw bits 0xae-0xb6.7 (9)
0x0b0|35 95 61 a1 35 95 61 |5.a.5.a |
| | | [1]: extra_field {} 0xb7-0xc5.7 (15)
0x0b0| 75 78 | ux | header_id: 0x7875 (UNIX UID/GID) 0xb7-0xb8.7 (2)
0x0b0| 0b 00 | .. | data_size: 11 0xb9-0xba.7 (2)
0x0b0| 01 04 f5 01 00| .....| data: raw bits 0xbb-0xc5.7 (11)
0x0c0|00 04 14 00 00 00 |...... |
0x0c0| 61 61 61 61 | aaaa | uncompressed: raw bits 0xc6-0xc9.7 (4)
| | | [3]: local_file {} 0xca-0x142.7 (121)
0x0c0| 50 4b 03 04 | PK.. | signature: raw bits (valid) 0xca-0xcd.7 (4)
0x0c0| 0a 00| ..| version_needed: 10 0xce-0xcf.7 (2)
| | | flags: {} 0xd0-0xd1.7 (2)
0x0d0|00 |. | unused0: 0 0xd0-0xd0 (0.1)
0x0d0|00 |. | strong_encryption: false 0xd0.1-0xd0.1 (0.1)
0x0d0|00 |. | compressed_patched_data: false 0xd0.2-0xd0.2 (0.1)
0x0d0|00 |. | enhanced_deflation: false 0xd0.3-0xd0.3 (0.1)
0x0d0|00 |. | data_descriptor: false 0xd0.4-0xd0.4 (0.1)
0x0d0|00 |. | compression0: false 0xd0.5-0xd0.5 (0.1)
0x0d0|00 |. | compression1: false 0xd0.6-0xd0.6 (0.1)
0x0d0|00 |. | encrypted: false 0xd0.7-0xd0.7 (0.1)
0x0d0| 00 | . | reserved0: 0 0xd1-0xd1.1 (0.2)
0x0d0| 00 | . | mask_header_values: false 0xd1.2-0xd1.2 (0.1)
0x0d0| 00 | . | reserved1: false 0xd1.3-0xd1.3 (0.1)
0x0d0| 00 | . | language_encoding: false 0xd1.4-0xd1.4 (0.1)
0x0d0| 00 | . | unused1: 0 0xd1.5-0xd1.7 (0.3)
0x0d0| 00 00 | .. | compression_method: "None" (0) 0xd2-0xd3.7 (2)
| | | last_modification_date: {} 0xd4-0xd5.7 (2)
0x0d0| f4 | . | hours: 30 0xd4-0xd4.4 (0.5)
0x0d0| f4 94 | .. | minutes: 36 0xd4.5-0xd5.2 (0.6)
0x0d0| 94 | . | seconds: 20 0xd5.3-0xd5.7 (0.5)
| | | last_modification_time: {} 0xd6-0xd7.7 (2)
0x0d0| 71 | q | year: 56 0xd6-0xd6.6 (0.7)
0x0d0| 71 53 | qS | month: 10 0xd6.7-0xd7.2 (0.4)
0x0d0| 53 | S | day: 19 0xd7.3-0xd7.7 (0.5)
0x0d0| 2c 89 b3 aa | ,... | crc32_uncompressed: 0xaab3892c 0xd8-0xdb.7 (4)
0x0d0| 35 00 00 00| 5...| compressed_size: 53 0xdc-0xdf.7 (4)
0x0e0|35 00 00 00 |5... | uncompressed_size: 53 0xe0-0xe3.7 (4)
0x0e0| 0a 00 | .. | file_name_length: 10 0xe4-0xe5.7 (2)
0x0e0| 1c 00 | .. | extra_field_length: 28 0xe6-0xe7.7 (2)
0x0e0| 74 65 73 74 2f 61 2e 74| test/a.t| file_name: "test/a.txt" 0xe8-0xf1.7 (10)
0x0f0|78 74 |xt |
| | | extra_fields: [2] 0xf2-0x10d.7 (28)
| | | [0]: extra_field {} 0xf2-0xfe.7 (13)
0x0f0| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0xf2-0xf3.7 (2)
0x0f0| 09 00 | .. | data_size: 9 0xf4-0xf5.7 (2)
0x0f0| 03 5b 3e 95 61 5d 3e 95 61 | .[>.a]>.a | data: raw bits 0xf6-0xfe.7 (9)
| | | [1]: extra_field {} 0xff-0x10d.7 (15)
0x0f0| 75| u| header_id: 0x7875 (UNIX UID/GID) 0xff-0x100.7 (2)
0x100|78 |x |
0x100| 0b 00 | .. | data_size: 11 0x101-0x102.7 (2)
0x100| 01 04 f5 01 00 00 04 14 00 00 00 | ........... | data: raw bits 0x103-0x10d.7 (11)
0x100| 61 61| aa| uncompressed: raw bits 0x10e-0x142.7 (53)
0x110|61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61|aaaaaaaaaaaaaaaa|
* |until 0x142.7 (53) | |
| | | central_directories: [4] 0x143-0x27c.7 (314)
| | | [0]: central_directory {} 0x143-0x18d.7 (75)
0x140| 50 4b 01 02 | PK.. | signature: raw bits (valid) 0x143-0x146.7 (4)
0x140| 1e 03 | .. | version_made_by: 798 0x147-0x148.7 (2)
0x140| 0a 00 | .. | version_needed: 10 0x149-0x14a.7 (2)
| | | flags: {} 0x14b-0x14c.7 (2)
0x140| 00 | . | unused0: 0 0x14b-0x14b (0.1)
0x140| 00 | . | strong_encryption: false 0x14b.1-0x14b.1 (0.1)
0x140| 00 | . | compressed_patched_data: false 0x14b.2-0x14b.2 (0.1)
0x140| 00 | . | enhanced_deflation: false 0x14b.3-0x14b.3 (0.1)
0x140| 00 | . | data_descriptor: false 0x14b.4-0x14b.4 (0.1)
0x140| 00 | . | compression0: false 0x14b.5-0x14b.5 (0.1)
0x140| 00 | . | compression1: false 0x14b.6-0x14b.6 (0.1)
0x140| 00 | . | encrypted: false 0x14b.7-0x14b.7 (0.1)
0x140| 00 | . | reserved0: 0 0x14c-0x14c.1 (0.2)
0x140| 00 | . | mask_header_values: false 0x14c.2-0x14c.2 (0.1)
0x140| 00 | . | reserved1: false 0x14c.3-0x14c.3 (0.1)
0x140| 00 | . | language_encoding: false 0x14c.4-0x14c.4 (0.1)
0x140| 00 | . | unused1: 0 0x14c.5-0x14c.7 (0.3)
0x140| 00 00 | .. | compression_method: "None" (0) 0x14d-0x14e.7 (2)
| | | last_modification_date: {} 0x14f-0x150.7 (2)
0x140| ef| .| hours: 29 0x14f-0x14f.4 (0.5)
0x140| ef| .| minutes: 60 0x14f.5-0x150.2 (0.6)
0x150|94 |. |
0x150|94 |. | seconds: 20 0x150.3-0x150.7 (0.5)
| | | last_modification_time: {} 0x151-0x152.7 (2)
0x150| 71 | q | year: 56 0x151-0x151.6 (0.7)
0x150| 71 53 | qS | month: 10 0x151.7-0x152.2 (0.4)
0x150| 53 | S | day: 19 0x152.3-0x152.7 (0.5)
0x150| 00 00 00 00 | .... | crc32_uncompressed: 0x0 0x153-0x156.7 (4)
0x150| 00 00 00 00 | .... | compressed_size: 0 0x157-0x15a.7 (4)
0x150| 00 00 00 00 | .... | uncompressed_size: 0 0x15b-0x15e.7 (4)
0x150| 05| .| file_name_length: 5 0x15f-0x160.7 (2)
0x160|00 |. |
0x160| 18 00 | .. | extra_field_length: 24 0x161-0x162.7 (2)
0x160| 00 00 | .. | file_comment_length: 0 0x163-0x164.7 (2)
0x160| 00 00 | .. | disk_number_where_file_starts: 0 0x165-0x166.7 (2)
0x160| 00 00 | .. | internal_file_attributes: 0 0x167-0x168.7 (2)
0x160| 10 00 ed 41 | ...A | external_file_attributes: 1106051088 0x169-0x16c.7 (4)
0x160| 00 00 00| ...| relative_offset_of_local_file_header: 0 0x16d-0x170.7 (4)
0x170|00 |. |
0x170| 74 65 73 74 2f | test/ | file_name: "test/" 0x171-0x175.7 (5)
| | | extra_fields: [2] 0x176-0x18d.7 (24)
| | | [0]: extra_field {} 0x176-0x17e.7 (9)
0x170| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x176-0x177.7 (2)
0x170| 05 00 | .. | data_size: 5 0x178-0x179.7 (2)
0x170| 03 52 3e 95 61 | .R>.a | data: raw bits 0x17a-0x17e.7 (5)
| | | [1]: extra_field {} 0x17f-0x18d.7 (15)
0x170| 75| u| header_id: 0x7875 (UNIX UID/GID) 0x17f-0x180.7 (2)
0x180|78 |x |
0x180| 0b 00 | .. | data_size: 11 0x181-0x182.7 (2)
0x180| 01 04 f5 01 00 00 04 14 00 00 00 | ........... | data: raw bits 0x183-0x18d.7 (11)
| | | file_comment: "" 0x18e-NA (0)
| | | [1]: central_directory {} 0x18e-0x1da.7 (77)
0x180| 50 4b| PK| signature: raw bits (valid) 0x18e-0x191.7 (4)
0x190|01 02 |.. |
0x190| 1e 03 | .. | version_made_by: 798 0x192-0x193.7 (2)
0x190| 0a 00 | .. | version_needed: 10 0x194-0x195.7 (2)
| | | flags: {} 0x196-0x197.7 (2)
0x190| 00 | . | unused0: 0 0x196-0x196 (0.1)
0x190| 00 | . | strong_encryption: false 0x196.1-0x196.1 (0.1)
0x190| 00 | . | compressed_patched_data: false 0x196.2-0x196.2 (0.1)
0x190| 00 | . | enhanced_deflation: false 0x196.3-0x196.3 (0.1)
0x190| 00 | . | data_descriptor: false 0x196.4-0x196.4 (0.1)
0x190| 00 | . | compression0: false 0x196.5-0x196.5 (0.1)
0x190| 00 | . | compression1: false 0x196.6-0x196.6 (0.1)
0x190| 00 | . | encrypted: false 0x196.7-0x196.7 (0.1)
0x190| 00 | . | reserved0: 0 0x197-0x197.1 (0.2)
0x190| 00 | . | mask_header_values: false 0x197.2-0x197.2 (0.1)
0x190| 00 | . | reserved1: false 0x197.3-0x197.3 (0.1)
0x190| 00 | . | language_encoding: false 0x197.4-0x197.4 (0.1)
0x190| 00 | . | unused1: 0 0x197.5-0x197.7 (0.3)
0x190| 00 00 | .. | compression_method: "None" (0) 0x198-0x199.7 (2)
| | | last_modification_date: {} 0x19a-0x19b.7 (2)
0x190| 4c | L | hours: 9 0x19a-0x19a.4 (0.5)
0x190| 4c 90 | L. | minutes: 36 0x19a.5-0x19b.2 (0.6)
0x190| 90 | . | seconds: 16 0x19b.3-0x19b.7 (0.5)
| | | last_modification_time: {} 0x19c-0x19d.7 (2)
0x190| 71 | q | year: 56 0x19c-0x19c.6 (0.7)
0x190| 71 53 | qS | month: 10 0x19c.7-0x19d.2 (0.4)
0x190| 53 | S | day: 19 0x19d.3-0x19d.7 (0.5)
0x190| 00 00| ..| crc32_uncompressed: 0x0 0x19e-0x1a1.7 (4)
0x1a0|00 00 |.. |
0x1a0| 00 00 00 00 | .... | compressed_size: 0 0x1a2-0x1a5.7 (4)
0x1a0| 00 00 00 00 | .... | uncompressed_size: 0 0x1a6-0x1a9.7 (4)
0x1a0| 07 00 | .. | file_name_length: 7 0x1aa-0x1ab.7 (2)
0x1a0| 18 00 | .. | extra_field_length: 24 0x1ac-0x1ad.7 (2)
0x1a0| 00 00| ..| file_comment_length: 0 0x1ae-0x1af.7 (2)
0x1b0|00 00 |.. | disk_number_where_file_starts: 0 0x1b0-0x1b1.7 (2)
0x1b0| 00 00 | .. | internal_file_attributes: 0 0x1b2-0x1b3.7 (2)
0x1b0| 10 00 ed 41 | ...A | external_file_attributes: 1106051088 0x1b4-0x1b7.7 (4)
0x1b0| 3f 00 00 00 | ?... | relative_offset_of_local_file_header: 63 0x1b8-0x1bb.7 (4)
0x1b0| 74 65 73 74| test| file_name: "test/a/" 0x1bc-0x1c2.7 (7)
0x1c0|2f 61 2f |/a/ |
| | | extra_fields: [2] 0x1c3-0x1da.7 (24)
| | | [0]: extra_field {} 0x1c3-0x1cb.7 (9)
0x1c0| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x1c3-0x1c4.7 (2)
0x1c0| 05 00 | .. | data_size: 5 0x1c5-0x1c6.7 (2)
0x1c0| 03 a0 35 95 61 | ..5.a | data: raw bits 0x1c7-0x1cb.7 (5)
| | | [1]: extra_field {} 0x1cc-0x1da.7 (15)
0x1c0| 75 78 | ux | header_id: 0x7875 (UNIX UID/GID) 0x1cc-0x1cd.7 (2)
0x1c0| 0b 00| ..| data_size: 11 0x1ce-0x1cf.7 (2)
0x1d0|01 04 f5 01 00 00 04 14 00 00 00 |........... | data: raw bits 0x1d0-0x1da.7 (11)
| | | file_comment: "" 0x1db-NA (0)
| | | [2]: central_directory {} 0x1db-0x22c.7 (82)
0x1d0| 50 4b 01 02 | PK.. | signature: raw bits (valid) 0x1db-0x1de.7 (4)
0x1d0| 1e| .| version_made_by: 798 0x1df-0x1e0.7 (2)
0x1e0|03 |. |
0x1e0| 0a 00 | .. | version_needed: 10 0x1e1-0x1e2.7 (2)
| | | flags: {} 0x1e3-0x1e4.7 (2)
0x1e0| 00 | . | unused0: 0 0x1e3-0x1e3 (0.1)
0x1e0| 00 | . | strong_encryption: false 0x1e3.1-0x1e3.1 (0.1)
0x1e0| 00 | . | compressed_patched_data: false 0x1e3.2-0x1e3.2 (0.1)
0x1e0| 00 | . | enhanced_deflation: false 0x1e3.3-0x1e3.3 (0.1)
0x1e0| 00 | . | data_descriptor: false 0x1e3.4-0x1e3.4 (0.1)
0x1e0| 00 | . | compression0: false 0x1e3.5-0x1e3.5 (0.1)
0x1e0| 00 | . | compression1: false 0x1e3.6-0x1e3.6 (0.1)
0x1e0| 00 | . | encrypted: false 0x1e3.7-0x1e3.7 (0.1)
0x1e0| 00 | . | reserved0: 0 0x1e4-0x1e4.1 (0.2)
0x1e0| 00 | . | mask_header_values: false 0x1e4.2-0x1e4.2 (0.1)
0x1e0| 00 | . | reserved1: false 0x1e4.3-0x1e4.3 (0.1)
0x1e0| 00 | . | language_encoding: false 0x1e4.4-0x1e4.4 (0.1)
0x1e0| 00 | . | unused1: 0 0x1e4.5-0x1e4.7 (0.3)
0x1e0| 00 00 | .. | compression_method: "None" (0) 0x1e5-0x1e6.7 (2)
| | | last_modification_date: {} 0x1e7-0x1e8.7 (2)
0x1e0| 4c | L | hours: 9 0x1e7-0x1e7.4 (0.5)
0x1e0| 4c 90 | L. | minutes: 36 0x1e7.5-0x1e8.2 (0.6)
0x1e0| 90 | . | seconds: 16 0x1e8.3-0x1e8.7 (0.5)
| | | last_modification_time: {} 0x1e9-0x1ea.7 (2)
0x1e0| 71 | q | year: 56 0x1e9-0x1e9.6 (0.7)
0x1e0| 71 53 | qS | month: 10 0x1e9.7-0x1ea.2 (0.4)
0x1e0| 53 | S | day: 19 0x1ea.3-0x1ea.7 (0.5)
0x1e0| 45 e5 98 ad | E... | crc32_uncompressed: 0xad98e545 0x1eb-0x1ee.7 (4)
0x1e0| 04| .| compressed_size: 4 0x1ef-0x1f2.7 (4)
0x1f0|00 00 00 |... |
0x1f0| 04 00 00 00 | .... | uncompressed_size: 4 0x1f3-0x1f6.7 (4)
0x1f0| 0c 00 | .. | file_name_length: 12 0x1f7-0x1f8.7 (2)
0x1f0| 18 00 | .. | extra_field_length: 24 0x1f9-0x1fa.7 (2)
0x1f0| 00 00 | .. | file_comment_length: 0 0x1fb-0x1fc.7 (2)
0x1f0| 00 00 | .. | disk_number_where_file_starts: 0 0x1fd-0x1fe.7 (2)
0x1f0| 00| .| internal_file_attributes: 0 0x1ff-0x200.7 (2)
0x200|00 |. |
0x200| 00 00 a4 81 | .... | external_file_attributes: 2175008768 0x201-0x204.7 (4)
0x200| 80 00 00 00 | .... | relative_offset_of_local_file_header: 128 0x205-0x208.7 (4)
0x200| 74 65 73 74 2f 61 2f| test/a/| file_name: "test/a/a.txt" 0x209-0x214.7 (12)
0x210|61 2e 74 78 74 |a.txt |
| | | extra_fields: [2] 0x215-0x22c.7 (24)
| | | [0]: extra_field {} 0x215-0x21d.7 (9)
0x210| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x215-0x216.7 (2)
0x210| 05 00 | .. | data_size: 5 0x217-0x218.7 (2)
0x210| 03 a0 35 95 61 | ..5.a | data: raw bits 0x219-0x21d.7 (5)
| | | [1]: extra_field {} 0x21e-0x22c.7 (15)
0x210| 75 78| ux| header_id: 0x7875 (UNIX UID/GID) 0x21e-0x21f.7 (2)
0x220|0b 00 |.. | data_size: 11 0x220-0x221.7 (2)
0x220| 01 04 f5 01 00 00 04 14 00 00 00 | ........... | data: raw bits 0x222-0x22c.7 (11)
| | | file_comment: "" 0x22d-NA (0)
| | | [3]: central_directory {} 0x22d-0x27c.7 (80)
0x220| 50 4b 01| PK.| signature: raw bits (valid) 0x22d-0x230.7 (4)
0x230|02 |. |
0x230| 1e 03 | .. | version_made_by: 798 0x231-0x232.7 (2)
0x230| 0a 00 | .. | version_needed: 10 0x233-0x234.7 (2)
| | | flags: {} 0x235-0x236.7 (2)
0x230| 00 | . | unused0: 0 0x235-0x235 (0.1)
0x230| 00 | . | strong_encryption: false 0x235.1-0x235.1 (0.1)
0x230| 00 | . | compressed_patched_data: false 0x235.2-0x235.2 (0.1)
0x230| 00 | . | enhanced_deflation: false 0x235.3-0x235.3 (0.1)
0x230| 00 | . | data_descriptor: false 0x235.4-0x235.4 (0.1)
0x230| 00 | . | compression0: false 0x235.5-0x235.5 (0.1)
0x230| 00 | . | compression1: false 0x235.6-0x235.6 (0.1)
0x230| 00 | . | encrypted: false 0x235.7-0x235.7 (0.1)
0x230| 00 | . | reserved0: 0 0x236-0x236.1 (0.2)
0x230| 00 | . | mask_header_values: false 0x236.2-0x236.2 (0.1)
0x230| 00 | . | reserved1: false 0x236.3-0x236.3 (0.1)
0x230| 00 | . | language_encoding: false 0x236.4-0x236.4 (0.1)
0x230| 00 | . | unused1: 0 0x236.5-0x236.7 (0.3)
0x230| 00 00 | .. | compression_method: "None" (0) 0x237-0x238.7 (2)
| | | last_modification_date: {} 0x239-0x23a.7 (2)
0x230| f4 | . | hours: 30 0x239-0x239.4 (0.5)
0x230| f4 94 | .. | minutes: 36 0x239.5-0x23a.2 (0.6)
0x230| 94 | . | seconds: 20 0x23a.3-0x23a.7 (0.5)
| | | last_modification_time: {} 0x23b-0x23c.7 (2)
0x230| 71 | q | year: 56 0x23b-0x23b.6 (0.7)
0x230| 71 53 | qS | month: 10 0x23b.7-0x23c.2 (0.4)
0x230| 53 | S | day: 19 0x23c.3-0x23c.7 (0.5)
0x230| 2c 89 b3| ,..| crc32_uncompressed: 0xaab3892c 0x23d-0x240.7 (4)
0x240|aa |. |
0x240| 35 00 00 00 | 5... | compressed_size: 53 0x241-0x244.7 (4)
0x240| 35 00 00 00 | 5... | uncompressed_size: 53 0x245-0x248.7 (4)
0x240| 0a 00 | .. | file_name_length: 10 0x249-0x24a.7 (2)
0x240| 18 00 | .. | extra_field_length: 24 0x24b-0x24c.7 (2)
0x240| 00 00 | .. | file_comment_length: 0 0x24d-0x24e.7 (2)
0x240| 00| .| disk_number_where_file_starts: 0 0x24f-0x250.7 (2)
0x250|00 |. |
0x250| 00 00 | .. | internal_file_attributes: 0 0x251-0x252.7 (2)
0x250| 00 00 a4 81 | .... | external_file_attributes: 2175008768 0x253-0x256.7 (4)
0x250| ca 00 00 00 | .... | relative_offset_of_local_file_header: 202 0x257-0x25a.7 (4)
0x250| 74 65 73 74 2f| test/| file_name: "test/a.txt" 0x25b-0x264.7 (10)
0x260|61 2e 74 78 74 |a.txt |
| | | extra_fields: [2] 0x265-0x27c.7 (24)
| | | [0]: extra_field {} 0x265-0x26d.7 (9)
0x260| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x265-0x266.7 (2)
0x260| 05 00 | .. | data_size: 5 0x267-0x268.7 (2)
0x260| 03 5b 3e 95 61 | .[>.a | data: raw bits 0x269-0x26d.7 (5)
| | | [1]: extra_field {} 0x26e-0x27c.7 (15)
0x260| 75 78| ux| header_id: 0x7875 (UNIX UID/GID) 0x26e-0x26f.7 (2)
0x270|0b 00 |.. | data_size: 11 0x270-0x271.7 (2)
0x270| 01 04 f5 01 00 00 04 14 00 00 00 | ........... | data: raw bits 0x272-0x27c.7 (11)
| | | file_comment: "" 0x27d-NA (0)
| | | end_of_central_directory: {} 0x27d-0x292.7 (22)
0x270| 50 4b 05| PK.| signature: raw bits (valid) 0x27d-0x280.7 (4)
0x280|06 |. |
0x280| 00 00 | .. | disk_nr: 0 0x281-0x282.7 (2)
0x280| 00 00 | .. | central_directory_start_disk_nr: 0 0x283-0x284.7 (2)
0x280| 04 00 | .. | nr_of_central_directory_records_on_disk: 4 0x285-0x286.7 (2)
0x280| 04 00 | .. | nr_of_central_directory_records: 4 0x287-0x288.7 (2)
0x280| 3a 01 00 00 | :... | size_of_central directory: 314 0x289-0x28c.7 (4)
0x280| 43 01 00| C..| offset_of_start_of_central_directory: 323 0x28d-0x290.7 (4)
0x290|00 |. |
0x290| 00 00| | ..| | comment_length: 0 0x291-0x292.7 (2)
| | | comment: "" 0x293-NA (0)

BIN
format/zip/testdata/test0.zip vendored Normal file

Binary file not shown.

403
format/zip/testdata/test9.fqtest vendored Normal file
View File

@ -0,0 +1,403 @@
$ fq -d zip verbose /test9.zip
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.: {} /test9.zip (zip) 0x0-0x263.7 (612)
| | | local_files: [4] 0x0-0x113.7 (276)
| | | [0]: local_file {} 0x0-0x3e.7 (63)
0x000|50 4b 03 04 |PK.. | signature: raw bits (valid) 0x0-0x3.7 (4)
0x000| 0a 00 | .. | version_needed: 10 0x4-0x5.7 (2)
| | | flags: {} 0x6-0x7.7 (2)
0x000| 00 | . | unused0: 0 0x6-0x6 (0.1)
0x000| 00 | . | strong_encryption: false 0x6.1-0x6.1 (0.1)
0x000| 00 | . | compressed_patched_data: false 0x6.2-0x6.2 (0.1)
0x000| 00 | . | enhanced_deflation: false 0x6.3-0x6.3 (0.1)
0x000| 00 | . | data_descriptor: false 0x6.4-0x6.4 (0.1)
0x000| 00 | . | compression0: false 0x6.5-0x6.5 (0.1)
0x000| 00 | . | compression1: false 0x6.6-0x6.6 (0.1)
0x000| 00 | . | encrypted: false 0x6.7-0x6.7 (0.1)
0x000| 00 | . | reserved0: 0 0x7-0x7.1 (0.2)
0x000| 00 | . | mask_header_values: false 0x7.2-0x7.2 (0.1)
0x000| 00 | . | reserved1: false 0x7.3-0x7.3 (0.1)
0x000| 00 | . | language_encoding: false 0x7.4-0x7.4 (0.1)
0x000| 00 | . | unused1: 0 0x7.5-0x7.7 (0.3)
0x000| 00 00 | .. | compression_method: "None" (0) 0x8-0x9.7 (2)
| | | last_modification_date: {} 0xa-0xb.7 (2)
0x000| ef | . | hours: 29 0xa-0xa.4 (0.5)
0x000| ef 94 | .. | minutes: 60 0xa.5-0xb.2 (0.6)
0x000| 94 | . | seconds: 20 0xb.3-0xb.7 (0.5)
| | | last_modification_time: {} 0xc-0xd.7 (2)
0x000| 71 | q | year: 56 0xc-0xc.6 (0.7)
0x000| 71 53 | qS | month: 10 0xc.7-0xd.2 (0.4)
0x000| 53 | S | day: 19 0xd.3-0xd.7 (0.5)
0x000| 00 00| ..| crc32_uncompressed: 0x0 0xe-0x11.7 (4)
0x010|00 00 |.. |
0x010| 00 00 00 00 | .... | compressed_size: 0 0x12-0x15.7 (4)
0x010| 00 00 00 00 | .... | uncompressed_size: 0 0x16-0x19.7 (4)
0x010| 05 00 | .. | file_name_length: 5 0x1a-0x1b.7 (2)
0x010| 1c 00 | .. | extra_field_length: 28 0x1c-0x1d.7 (2)
0x010| 74 65| te| file_name: "test/" 0x1e-0x22.7 (5)
0x020|73 74 2f |st/ |
| | | extra_fields: [2] 0x23-0x3e.7 (28)
| | | [0]: extra_field {} 0x23-0x2f.7 (13)
0x020| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x23-0x24.7 (2)
0x020| 09 00 | .. | data_size: 9 0x25-0x26.7 (2)
0x020| 03 52 3e 95 61 59 3e 95 61| .R>.aY>.a| data: raw bits 0x27-0x2f.7 (9)
| | | [1]: extra_field {} 0x30-0x3e.7 (15)
0x030|75 78 |ux | header_id: 0x7875 (UNIX UID/GID) 0x30-0x31.7 (2)
0x030| 0b 00 | .. | data_size: 11 0x32-0x33.7 (2)
0x030| 01 04 f5 01 00 00 04 14 00 00 00 | ........... | data: raw bits 0x34-0x3e.7 (11)
| | | uncompressed: raw bits 0x3f-NA (0)
| | | [1]: local_file {} 0x3f-0x7f.7 (65)
0x030| 50| P| signature: raw bits (valid) 0x3f-0x42.7 (4)
0x040|4b 03 04 |K.. |
0x040| 0a 00 | .. | version_needed: 10 0x43-0x44.7 (2)
| | | flags: {} 0x45-0x46.7 (2)
0x040| 00 | . | unused0: 0 0x45-0x45 (0.1)
0x040| 00 | . | strong_encryption: false 0x45.1-0x45.1 (0.1)
0x040| 00 | . | compressed_patched_data: false 0x45.2-0x45.2 (0.1)
0x040| 00 | . | enhanced_deflation: false 0x45.3-0x45.3 (0.1)
0x040| 00 | . | data_descriptor: false 0x45.4-0x45.4 (0.1)
0x040| 00 | . | compression0: false 0x45.5-0x45.5 (0.1)
0x040| 00 | . | compression1: false 0x45.6-0x45.6 (0.1)
0x040| 00 | . | encrypted: false 0x45.7-0x45.7 (0.1)
0x040| 00 | . | reserved0: 0 0x46-0x46.1 (0.2)
0x040| 00 | . | mask_header_values: false 0x46.2-0x46.2 (0.1)
0x040| 00 | . | reserved1: false 0x46.3-0x46.3 (0.1)
0x040| 00 | . | language_encoding: false 0x46.4-0x46.4 (0.1)
0x040| 00 | . | unused1: 0 0x46.5-0x46.7 (0.3)
0x040| 00 00 | .. | compression_method: "None" (0) 0x47-0x48.7 (2)
| | | last_modification_date: {} 0x49-0x4a.7 (2)
0x040| 4c | L | hours: 9 0x49-0x49.4 (0.5)
0x040| 4c 90 | L. | minutes: 36 0x49.5-0x4a.2 (0.6)
0x040| 90 | . | seconds: 16 0x4a.3-0x4a.7 (0.5)
| | | last_modification_time: {} 0x4b-0x4c.7 (2)
0x040| 71 | q | year: 56 0x4b-0x4b.6 (0.7)
0x040| 71 53 | qS | month: 10 0x4b.7-0x4c.2 (0.4)
0x040| 53 | S | day: 19 0x4c.3-0x4c.7 (0.5)
0x040| 00 00 00| ...| crc32_uncompressed: 0x0 0x4d-0x50.7 (4)
0x050|00 |. |
0x050| 00 00 00 00 | .... | compressed_size: 0 0x51-0x54.7 (4)
0x050| 00 00 00 00 | .... | uncompressed_size: 0 0x55-0x58.7 (4)
0x050| 07 00 | .. | file_name_length: 7 0x59-0x5a.7 (2)
0x050| 1c 00 | .. | extra_field_length: 28 0x5b-0x5c.7 (2)
0x050| 74 65 73| tes| file_name: "test/a/" 0x5d-0x63.7 (7)
0x060|74 2f 61 2f |t/a/ |
| | | extra_fields: [2] 0x64-0x7f.7 (28)
| | | [0]: extra_field {} 0x64-0x70.7 (13)
0x060| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x64-0x65.7 (2)
0x060| 09 00 | .. | data_size: 9 0x66-0x67.7 (2)
0x060| 03 a0 35 95 61 a0 35 95| ..5.a.5.| data: raw bits 0x68-0x70.7 (9)
0x070|61 |a |
| | | [1]: extra_field {} 0x71-0x7f.7 (15)
0x070| 75 78 | ux | header_id: 0x7875 (UNIX UID/GID) 0x71-0x72.7 (2)
0x070| 0b 00 | .. | data_size: 11 0x73-0x74.7 (2)
0x070| 01 04 f5 01 00 00 04 14 00 00 00| ...........| data: raw bits 0x75-0x7f.7 (11)
| | | uncompressed: raw bits 0x80-NA (0)
| | | [2]: local_file {} 0x80-0xc9.7 (74)
0x080|50 4b 03 04 |PK.. | signature: raw bits (valid) 0x80-0x83.7 (4)
0x080| 0a 00 | .. | version_needed: 10 0x84-0x85.7 (2)
| | | flags: {} 0x86-0x87.7 (2)
0x080| 02 | . | unused0: 0 0x86-0x86 (0.1)
0x080| 02 | . | strong_encryption: false 0x86.1-0x86.1 (0.1)
0x080| 02 | . | compressed_patched_data: false 0x86.2-0x86.2 (0.1)
0x080| 02 | . | enhanced_deflation: false 0x86.3-0x86.3 (0.1)
0x080| 02 | . | data_descriptor: false 0x86.4-0x86.4 (0.1)
0x080| 02 | . | compression0: false 0x86.5-0x86.5 (0.1)
0x080| 02 | . | compression1: true 0x86.6-0x86.6 (0.1)
0x080| 02 | . | encrypted: false 0x86.7-0x86.7 (0.1)
0x080| 00 | . | reserved0: 0 0x87-0x87.1 (0.2)
0x080| 00 | . | mask_header_values: false 0x87.2-0x87.2 (0.1)
0x080| 00 | . | reserved1: false 0x87.3-0x87.3 (0.1)
0x080| 00 | . | language_encoding: false 0x87.4-0x87.4 (0.1)
0x080| 00 | . | unused1: 0 0x87.5-0x87.7 (0.3)
0x080| 00 00 | .. | compression_method: "None" (0) 0x88-0x89.7 (2)
| | | last_modification_date: {} 0x8a-0x8b.7 (2)
0x080| 4c | L | hours: 9 0x8a-0x8a.4 (0.5)
0x080| 4c 90 | L. | minutes: 36 0x8a.5-0x8b.2 (0.6)
0x080| 90 | . | seconds: 16 0x8b.3-0x8b.7 (0.5)
| | | last_modification_time: {} 0x8c-0x8d.7 (2)
0x080| 71 | q | year: 56 0x8c-0x8c.6 (0.7)
0x080| 71 53 | qS | month: 10 0x8c.7-0x8d.2 (0.4)
0x080| 53 | S | day: 19 0x8d.3-0x8d.7 (0.5)
0x080| 45 e5| E.| crc32_uncompressed: 0xad98e545 0x8e-0x91.7 (4)
0x090|98 ad |.. |
0x090| 04 00 00 00 | .... | compressed_size: 4 0x92-0x95.7 (4)
0x090| 04 00 00 00 | .... | uncompressed_size: 4 0x96-0x99.7 (4)
0x090| 0c 00 | .. | file_name_length: 12 0x9a-0x9b.7 (2)
0x090| 1c 00 | .. | extra_field_length: 28 0x9c-0x9d.7 (2)
0x090| 74 65| te| file_name: "test/a/a.txt" 0x9e-0xa9.7 (12)
0x0a0|73 74 2f 61 2f 61 2e 74 78 74 |st/a/a.txt |
| | | extra_fields: [2] 0xaa-0xc5.7 (28)
| | | [0]: extra_field {} 0xaa-0xb6.7 (13)
0x0a0| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0xaa-0xab.7 (2)
0x0a0| 09 00 | .. | data_size: 9 0xac-0xad.7 (2)
0x0a0| 03 a0| ..| data: raw bits 0xae-0xb6.7 (9)
0x0b0|35 95 61 a1 35 95 61 |5.a.5.a |
| | | [1]: extra_field {} 0xb7-0xc5.7 (15)
0x0b0| 75 78 | ux | header_id: 0x7875 (UNIX UID/GID) 0xb7-0xb8.7 (2)
0x0b0| 0b 00 | .. | data_size: 11 0xb9-0xba.7 (2)
0x0b0| 01 04 f5 01 00| .....| data: raw bits 0xbb-0xc5.7 (11)
0x0c0|00 04 14 00 00 00 |...... |
0x0c0| 61 61 61 61 | aaaa | uncompressed: raw bits 0xc6-0xc9.7 (4)
| | | [3]: local_file {} 0xca-0x113.7 (74)
0x0c0| 50 4b 03 04 | PK.. | signature: raw bits (valid) 0xca-0xcd.7 (4)
0x0c0| 14 00| ..| version_needed: 20 0xce-0xcf.7 (2)
| | | flags: {} 0xd0-0xd1.7 (2)
0x0d0|02 |. | unused0: 0 0xd0-0xd0 (0.1)
0x0d0|02 |. | strong_encryption: false 0xd0.1-0xd0.1 (0.1)
0x0d0|02 |. | compressed_patched_data: false 0xd0.2-0xd0.2 (0.1)
0x0d0|02 |. | enhanced_deflation: false 0xd0.3-0xd0.3 (0.1)
0x0d0|02 |. | data_descriptor: false 0xd0.4-0xd0.4 (0.1)
0x0d0|02 |. | compression0: false 0xd0.5-0xd0.5 (0.1)
0x0d0|02 |. | compression1: true 0xd0.6-0xd0.6 (0.1)
0x0d0|02 |. | encrypted: false 0xd0.7-0xd0.7 (0.1)
0x0d0| 00 | . | reserved0: 0 0xd1-0xd1.1 (0.2)
0x0d0| 00 | . | mask_header_values: false 0xd1.2-0xd1.2 (0.1)
0x0d0| 00 | . | reserved1: false 0xd1.3-0xd1.3 (0.1)
0x0d0| 00 | . | language_encoding: false 0xd1.4-0xd1.4 (0.1)
0x0d0| 00 | . | unused1: 0 0xd1.5-0xd1.7 (0.3)
0x0d0| 08 00 | .. | compression_method: "Deflated" (8) 0xd2-0xd3.7 (2)
| | | last_modification_date: {} 0xd4-0xd5.7 (2)
0x0d0| f4 | . | hours: 30 0xd4-0xd4.4 (0.5)
0x0d0| f4 94 | .. | minutes: 36 0xd4.5-0xd5.2 (0.6)
0x0d0| 94 | . | seconds: 20 0xd5.3-0xd5.7 (0.5)
| | | last_modification_time: {} 0xd6-0xd7.7 (2)
0x0d0| 71 | q | year: 56 0xd6-0xd6.6 (0.7)
0x0d0| 71 53 | qS | month: 10 0xd6.7-0xd7.2 (0.4)
0x0d0| 53 | S | day: 19 0xd7.3-0xd7.7 (0.5)
0x0d0| 2c 89 b3 aa | ,... | crc32_uncompressed: 0xaab3892c 0xd8-0xdb.7 (4)
0x0d0| 06 00 00 00| ....| compressed_size: 6 0xdc-0xdf.7 (4)
0x0e0|35 00 00 00 |5... | uncompressed_size: 53 0xe0-0xe3.7 (4)
0x0e0| 0a 00 | .. | file_name_length: 10 0xe4-0xe5.7 (2)
0x0e0| 1c 00 | .. | extra_field_length: 28 0xe6-0xe7.7 (2)
0x0e0| 74 65 73 74 2f 61 2e 74| test/a.t| file_name: "test/a.txt" 0xe8-0xf1.7 (10)
0x0f0|78 74 |xt |
| | | extra_fields: [2] 0xf2-0x10d.7 (28)
| | | [0]: extra_field {} 0xf2-0xfe.7 (13)
0x0f0| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0xf2-0xf3.7 (2)
0x0f0| 09 00 | .. | data_size: 9 0xf4-0xf5.7 (2)
0x0f0| 03 5b 3e 95 61 5d 3e 95 61 | .[>.a]>.a | data: raw bits 0xf6-0xfe.7 (9)
| | | [1]: extra_field {} 0xff-0x10d.7 (15)
0x0f0| 75| u| header_id: 0x7875 (UNIX UID/GID) 0xff-0x100.7 (2)
0x100|78 |x |
0x100| 0b 00 | .. | data_size: 11 0x101-0x102.7 (2)
0x100| 01 04 f5 01 00 00 04 14 00 00 00 | ........... | data: raw bits 0x103-0x10d.7 (11)
0x00|61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61|aaaaaaaaaaaaaaaa| uncompressed: raw bits 0x0-0x34.7 (53)
* |until 0x34.7 (end) (53) | |
0x100| 4b 4c| KL| compressed: raw bits 0x10e-0x113.7 (6)
0x110|24 03 00 00 |$... |
| | | central_directories: [4] 0x114-0x24d.7 (314)
| | | [0]: central_directory {} 0x114-0x15e.7 (75)
0x110| 50 4b 01 02 | PK.. | signature: raw bits (valid) 0x114-0x117.7 (4)
0x110| 1e 03 | .. | version_made_by: 798 0x118-0x119.7 (2)
0x110| 0a 00 | .. | version_needed: 10 0x11a-0x11b.7 (2)
| | | flags: {} 0x11c-0x11d.7 (2)
0x110| 00 | . | unused0: 0 0x11c-0x11c (0.1)
0x110| 00 | . | strong_encryption: false 0x11c.1-0x11c.1 (0.1)
0x110| 00 | . | compressed_patched_data: false 0x11c.2-0x11c.2 (0.1)
0x110| 00 | . | enhanced_deflation: false 0x11c.3-0x11c.3 (0.1)
0x110| 00 | . | data_descriptor: false 0x11c.4-0x11c.4 (0.1)
0x110| 00 | . | compression0: false 0x11c.5-0x11c.5 (0.1)
0x110| 00 | . | compression1: false 0x11c.6-0x11c.6 (0.1)
0x110| 00 | . | encrypted: false 0x11c.7-0x11c.7 (0.1)
0x110| 00 | . | reserved0: 0 0x11d-0x11d.1 (0.2)
0x110| 00 | . | mask_header_values: false 0x11d.2-0x11d.2 (0.1)
0x110| 00 | . | reserved1: false 0x11d.3-0x11d.3 (0.1)
0x110| 00 | . | language_encoding: false 0x11d.4-0x11d.4 (0.1)
0x110| 00 | . | unused1: 0 0x11d.5-0x11d.7 (0.3)
0x110| 00 00| ..| compression_method: "None" (0) 0x11e-0x11f.7 (2)
| | | last_modification_date: {} 0x120-0x121.7 (2)
0x120|ef |. | hours: 29 0x120-0x120.4 (0.5)
0x120|ef 94 |.. | minutes: 60 0x120.5-0x121.2 (0.6)
0x120| 94 | . | seconds: 20 0x121.3-0x121.7 (0.5)
| | | last_modification_time: {} 0x122-0x123.7 (2)
0x120| 71 | q | year: 56 0x122-0x122.6 (0.7)
0x120| 71 53 | qS | month: 10 0x122.7-0x123.2 (0.4)
0x120| 53 | S | day: 19 0x123.3-0x123.7 (0.5)
0x120| 00 00 00 00 | .... | crc32_uncompressed: 0x0 0x124-0x127.7 (4)
0x120| 00 00 00 00 | .... | compressed_size: 0 0x128-0x12b.7 (4)
0x120| 00 00 00 00| ....| uncompressed_size: 0 0x12c-0x12f.7 (4)
0x130|05 00 |.. | file_name_length: 5 0x130-0x131.7 (2)
0x130| 18 00 | .. | extra_field_length: 24 0x132-0x133.7 (2)
0x130| 00 00 | .. | file_comment_length: 0 0x134-0x135.7 (2)
0x130| 00 00 | .. | disk_number_where_file_starts: 0 0x136-0x137.7 (2)
0x130| 00 00 | .. | internal_file_attributes: 0 0x138-0x139.7 (2)
0x130| 10 00 ed 41 | ...A | external_file_attributes: 1106051088 0x13a-0x13d.7 (4)
0x130| 00 00| ..| relative_offset_of_local_file_header: 0 0x13e-0x141.7 (4)
0x140|00 00 |.. |
0x140| 74 65 73 74 2f | test/ | file_name: "test/" 0x142-0x146.7 (5)
| | | extra_fields: [2] 0x147-0x15e.7 (24)
| | | [0]: extra_field {} 0x147-0x14f.7 (9)
0x140| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x147-0x148.7 (2)
0x140| 05 00 | .. | data_size: 5 0x149-0x14a.7 (2)
0x140| 03 52 3e 95 61| .R>.a| data: raw bits 0x14b-0x14f.7 (5)
| | | [1]: extra_field {} 0x150-0x15e.7 (15)
0x150|75 78 |ux | header_id: 0x7875 (UNIX UID/GID) 0x150-0x151.7 (2)
0x150| 0b 00 | .. | data_size: 11 0x152-0x153.7 (2)
0x150| 01 04 f5 01 00 00 04 14 00 00 00 | ........... | data: raw bits 0x154-0x15e.7 (11)
| | | file_comment: "" 0x15f-NA (0)
| | | [1]: central_directory {} 0x15f-0x1ab.7 (77)
0x150| 50| P| signature: raw bits (valid) 0x15f-0x162.7 (4)
0x160|4b 01 02 |K.. |
0x160| 1e 03 | .. | version_made_by: 798 0x163-0x164.7 (2)
0x160| 0a 00 | .. | version_needed: 10 0x165-0x166.7 (2)
| | | flags: {} 0x167-0x168.7 (2)
0x160| 00 | . | unused0: 0 0x167-0x167 (0.1)
0x160| 00 | . | strong_encryption: false 0x167.1-0x167.1 (0.1)
0x160| 00 | . | compressed_patched_data: false 0x167.2-0x167.2 (0.1)
0x160| 00 | . | enhanced_deflation: false 0x167.3-0x167.3 (0.1)
0x160| 00 | . | data_descriptor: false 0x167.4-0x167.4 (0.1)
0x160| 00 | . | compression0: false 0x167.5-0x167.5 (0.1)
0x160| 00 | . | compression1: false 0x167.6-0x167.6 (0.1)
0x160| 00 | . | encrypted: false 0x167.7-0x167.7 (0.1)
0x160| 00 | . | reserved0: 0 0x168-0x168.1 (0.2)
0x160| 00 | . | mask_header_values: false 0x168.2-0x168.2 (0.1)
0x160| 00 | . | reserved1: false 0x168.3-0x168.3 (0.1)
0x160| 00 | . | language_encoding: false 0x168.4-0x168.4 (0.1)
0x160| 00 | . | unused1: 0 0x168.5-0x168.7 (0.3)
0x160| 00 00 | .. | compression_method: "None" (0) 0x169-0x16a.7 (2)
| | | last_modification_date: {} 0x16b-0x16c.7 (2)
0x160| 4c | L | hours: 9 0x16b-0x16b.4 (0.5)
0x160| 4c 90 | L. | minutes: 36 0x16b.5-0x16c.2 (0.6)
0x160| 90 | . | seconds: 16 0x16c.3-0x16c.7 (0.5)
| | | last_modification_time: {} 0x16d-0x16e.7 (2)
0x160| 71 | q | year: 56 0x16d-0x16d.6 (0.7)
0x160| 71 53 | qS | month: 10 0x16d.7-0x16e.2 (0.4)
0x160| 53 | S | day: 19 0x16e.3-0x16e.7 (0.5)
0x160| 00| .| crc32_uncompressed: 0x0 0x16f-0x172.7 (4)
0x170|00 00 00 |... |
0x170| 00 00 00 00 | .... | compressed_size: 0 0x173-0x176.7 (4)
0x170| 00 00 00 00 | .... | uncompressed_size: 0 0x177-0x17a.7 (4)
0x170| 07 00 | .. | file_name_length: 7 0x17b-0x17c.7 (2)
0x170| 18 00 | .. | extra_field_length: 24 0x17d-0x17e.7 (2)
0x170| 00| .| file_comment_length: 0 0x17f-0x180.7 (2)
0x180|00 |. |
0x180| 00 00 | .. | disk_number_where_file_starts: 0 0x181-0x182.7 (2)
0x180| 00 00 | .. | internal_file_attributes: 0 0x183-0x184.7 (2)
0x180| 10 00 ed 41 | ...A | external_file_attributes: 1106051088 0x185-0x188.7 (4)
0x180| 3f 00 00 00 | ?... | relative_offset_of_local_file_header: 63 0x189-0x18c.7 (4)
0x180| 74 65 73| tes| file_name: "test/a/" 0x18d-0x193.7 (7)
0x190|74 2f 61 2f |t/a/ |
| | | extra_fields: [2] 0x194-0x1ab.7 (24)
| | | [0]: extra_field {} 0x194-0x19c.7 (9)
0x190| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x194-0x195.7 (2)
0x190| 05 00 | .. | data_size: 5 0x196-0x197.7 (2)
0x190| 03 a0 35 95 61 | ..5.a | data: raw bits 0x198-0x19c.7 (5)
| | | [1]: extra_field {} 0x19d-0x1ab.7 (15)
0x190| 75 78 | ux | header_id: 0x7875 (UNIX UID/GID) 0x19d-0x19e.7 (2)
0x190| 0b| .| data_size: 11 0x19f-0x1a0.7 (2)
0x1a0|00 |. |
0x1a0| 01 04 f5 01 00 00 04 14 00 00 00 | ........... | data: raw bits 0x1a1-0x1ab.7 (11)
| | | file_comment: "" 0x1ac-NA (0)
| | | [2]: central_directory {} 0x1ac-0x1fd.7 (82)
0x1a0| 50 4b 01 02| PK..| signature: raw bits (valid) 0x1ac-0x1af.7 (4)
0x1b0|1e 03 |.. | version_made_by: 798 0x1b0-0x1b1.7 (2)
0x1b0| 0a 00 | .. | version_needed: 10 0x1b2-0x1b3.7 (2)
| | | flags: {} 0x1b4-0x1b5.7 (2)
0x1b0| 02 | . | unused0: 0 0x1b4-0x1b4 (0.1)
0x1b0| 02 | . | strong_encryption: false 0x1b4.1-0x1b4.1 (0.1)
0x1b0| 02 | . | compressed_patched_data: false 0x1b4.2-0x1b4.2 (0.1)
0x1b0| 02 | . | enhanced_deflation: false 0x1b4.3-0x1b4.3 (0.1)
0x1b0| 02 | . | data_descriptor: false 0x1b4.4-0x1b4.4 (0.1)
0x1b0| 02 | . | compression0: false 0x1b4.5-0x1b4.5 (0.1)
0x1b0| 02 | . | compression1: true 0x1b4.6-0x1b4.6 (0.1)
0x1b0| 02 | . | encrypted: false 0x1b4.7-0x1b4.7 (0.1)
0x1b0| 00 | . | reserved0: 0 0x1b5-0x1b5.1 (0.2)
0x1b0| 00 | . | mask_header_values: false 0x1b5.2-0x1b5.2 (0.1)
0x1b0| 00 | . | reserved1: false 0x1b5.3-0x1b5.3 (0.1)
0x1b0| 00 | . | language_encoding: false 0x1b5.4-0x1b5.4 (0.1)
0x1b0| 00 | . | unused1: 0 0x1b5.5-0x1b5.7 (0.3)
0x1b0| 00 00 | .. | compression_method: "None" (0) 0x1b6-0x1b7.7 (2)
| | | last_modification_date: {} 0x1b8-0x1b9.7 (2)
0x1b0| 4c | L | hours: 9 0x1b8-0x1b8.4 (0.5)
0x1b0| 4c 90 | L. | minutes: 36 0x1b8.5-0x1b9.2 (0.6)
0x1b0| 90 | . | seconds: 16 0x1b9.3-0x1b9.7 (0.5)
| | | last_modification_time: {} 0x1ba-0x1bb.7 (2)
0x1b0| 71 | q | year: 56 0x1ba-0x1ba.6 (0.7)
0x1b0| 71 53 | qS | month: 10 0x1ba.7-0x1bb.2 (0.4)
0x1b0| 53 | S | day: 19 0x1bb.3-0x1bb.7 (0.5)
0x1b0| 45 e5 98 ad| E...| crc32_uncompressed: 0xad98e545 0x1bc-0x1bf.7 (4)
0x1c0|04 00 00 00 |.... | compressed_size: 4 0x1c0-0x1c3.7 (4)
0x1c0| 04 00 00 00 | .... | uncompressed_size: 4 0x1c4-0x1c7.7 (4)
0x1c0| 0c 00 | .. | file_name_length: 12 0x1c8-0x1c9.7 (2)
0x1c0| 18 00 | .. | extra_field_length: 24 0x1ca-0x1cb.7 (2)
0x1c0| 00 00 | .. | file_comment_length: 0 0x1cc-0x1cd.7 (2)
0x1c0| 00 00| ..| disk_number_where_file_starts: 0 0x1ce-0x1cf.7 (2)
0x1d0|01 00 |.. | internal_file_attributes: 1 0x1d0-0x1d1.7 (2)
0x1d0| 00 00 a4 81 | .... | external_file_attributes: 2175008768 0x1d2-0x1d5.7 (4)
0x1d0| 80 00 00 00 | .... | relative_offset_of_local_file_header: 128 0x1d6-0x1d9.7 (4)
0x1d0| 74 65 73 74 2f 61| test/a| file_name: "test/a/a.txt" 0x1da-0x1e5.7 (12)
0x1e0|2f 61 2e 74 78 74 |/a.txt |
| | | extra_fields: [2] 0x1e6-0x1fd.7 (24)
| | | [0]: extra_field {} 0x1e6-0x1ee.7 (9)
0x1e0| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x1e6-0x1e7.7 (2)
0x1e0| 05 00 | .. | data_size: 5 0x1e8-0x1e9.7 (2)
0x1e0| 03 a0 35 95 61 | ..5.a | data: raw bits 0x1ea-0x1ee.7 (5)
| | | [1]: extra_field {} 0x1ef-0x1fd.7 (15)
0x1e0| 75| u| header_id: 0x7875 (UNIX UID/GID) 0x1ef-0x1f0.7 (2)
0x1f0|78 |x |
0x1f0| 0b 00 | .. | data_size: 11 0x1f1-0x1f2.7 (2)
0x1f0| 01 04 f5 01 00 00 04 14 00 00 00 | ........... | data: raw bits 0x1f3-0x1fd.7 (11)
| | | file_comment: "" 0x1fe-NA (0)
| | | [3]: central_directory {} 0x1fe-0x24d.7 (80)
0x1f0| 50 4b| PK| signature: raw bits (valid) 0x1fe-0x201.7 (4)
0x200|01 02 |.. |
0x200| 1e 03 | .. | version_made_by: 798 0x202-0x203.7 (2)
0x200| 14 00 | .. | version_needed: 20 0x204-0x205.7 (2)
| | | flags: {} 0x206-0x207.7 (2)
0x200| 02 | . | unused0: 0 0x206-0x206 (0.1)
0x200| 02 | . | strong_encryption: false 0x206.1-0x206.1 (0.1)
0x200| 02 | . | compressed_patched_data: false 0x206.2-0x206.2 (0.1)
0x200| 02 | . | enhanced_deflation: false 0x206.3-0x206.3 (0.1)
0x200| 02 | . | data_descriptor: false 0x206.4-0x206.4 (0.1)
0x200| 02 | . | compression0: false 0x206.5-0x206.5 (0.1)
0x200| 02 | . | compression1: true 0x206.6-0x206.6 (0.1)
0x200| 02 | . | encrypted: false 0x206.7-0x206.7 (0.1)
0x200| 00 | . | reserved0: 0 0x207-0x207.1 (0.2)
0x200| 00 | . | mask_header_values: false 0x207.2-0x207.2 (0.1)
0x200| 00 | . | reserved1: false 0x207.3-0x207.3 (0.1)
0x200| 00 | . | language_encoding: false 0x207.4-0x207.4 (0.1)
0x200| 00 | . | unused1: 0 0x207.5-0x207.7 (0.3)
0x200| 08 00 | .. | compression_method: "Deflated" (8) 0x208-0x209.7 (2)
| | | last_modification_date: {} 0x20a-0x20b.7 (2)
0x200| f4 | . | hours: 30 0x20a-0x20a.4 (0.5)
0x200| f4 94 | .. | minutes: 36 0x20a.5-0x20b.2 (0.6)
0x200| 94 | . | seconds: 20 0x20b.3-0x20b.7 (0.5)
| | | last_modification_time: {} 0x20c-0x20d.7 (2)
0x200| 71 | q | year: 56 0x20c-0x20c.6 (0.7)
0x200| 71 53 | qS | month: 10 0x20c.7-0x20d.2 (0.4)
0x200| 53 | S | day: 19 0x20d.3-0x20d.7 (0.5)
0x200| 2c 89| ,.| crc32_uncompressed: 0xaab3892c 0x20e-0x211.7 (4)
0x210|b3 aa |.. |
0x210| 06 00 00 00 | .... | compressed_size: 6 0x212-0x215.7 (4)
0x210| 35 00 00 00 | 5... | uncompressed_size: 53 0x216-0x219.7 (4)
0x210| 0a 00 | .. | file_name_length: 10 0x21a-0x21b.7 (2)
0x210| 18 00 | .. | extra_field_length: 24 0x21c-0x21d.7 (2)
0x210| 00 00| ..| file_comment_length: 0 0x21e-0x21f.7 (2)
0x220|00 00 |.. | disk_number_where_file_starts: 0 0x220-0x221.7 (2)
0x220| 01 00 | .. | internal_file_attributes: 1 0x222-0x223.7 (2)
0x220| 00 00 a4 81 | .... | external_file_attributes: 2175008768 0x224-0x227.7 (4)
0x220| ca 00 00 00 | .... | relative_offset_of_local_file_header: 202 0x228-0x22b.7 (4)
0x220| 74 65 73 74| test| file_name: "test/a.txt" 0x22c-0x235.7 (10)
0x230|2f 61 2e 74 78 74 |/a.txt |
| | | extra_fields: [2] 0x236-0x24d.7 (24)
| | | [0]: extra_field {} 0x236-0x23e.7 (9)
0x230| 55 54 | UT | header_id: 0x5455 (extended timestamp) 0x236-0x237.7 (2)
0x230| 05 00 | .. | data_size: 5 0x238-0x239.7 (2)
0x230| 03 5b 3e 95 61 | .[>.a | data: raw bits 0x23a-0x23e.7 (5)
| | | [1]: extra_field {} 0x23f-0x24d.7 (15)
0x230| 75| u| header_id: 0x7875 (UNIX UID/GID) 0x23f-0x240.7 (2)
0x240|78 |x |
0x240| 0b 00 | .. | data_size: 11 0x241-0x242.7 (2)
0x240| 01 04 f5 01 00 00 04 14 00 00 00 | ........... | data: raw bits 0x243-0x24d.7 (11)
| | | file_comment: "" 0x24e-NA (0)
| | | end_of_central_directory: {} 0x24e-0x263.7 (22)
0x240| 50 4b| PK| signature: raw bits (valid) 0x24e-0x251.7 (4)
0x250|05 06 |.. |
0x250| 00 00 | .. | disk_nr: 0 0x252-0x253.7 (2)
0x250| 00 00 | .. | central_directory_start_disk_nr: 0 0x254-0x255.7 (2)
0x250| 04 00 | .. | nr_of_central_directory_records_on_disk: 4 0x256-0x257.7 (2)
0x250| 04 00 | .. | nr_of_central_directory_records: 4 0x258-0x259.7 (2)
0x250| 3a 01 00 00 | :... | size_of_central directory: 314 0x25a-0x25d.7 (4)
0x250| 14 01| ..| offset_of_start_of_central_directory: 276 0x25e-0x261.7 (4)
0x260|00 00 |.. |
0x260| 00 00| | ..| | comment_length: 0 0x262-0x263.7 (2)
| | | comment: "" 0x264-NA (0)

BIN
format/zip/testdata/test9.zip vendored Normal file

Binary file not shown.

338
format/zip/zip.go Normal file
View File

@ -0,0 +1,338 @@
package zip
// https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
// https://opensource.apple.com/source/zip/zip-6/unzip/unzip/proginfo/extra.fld
import (
"bytes"
"compress/flate"
"io"
"github.com/wader/fq/format"
"github.com/wader/fq/format/registry"
"github.com/wader/fq/pkg/bitio"
"github.com/wader/fq/pkg/decode"
)
var probeFormat decode.Group
func init() {
registry.MustRegister(decode.Format{
Name: format.ZIP,
Description: "ZIP archive",
Groups: []string{format.PROBE},
DecodeFn: zipDecode,
Dependencies: []decode.Dependency{
{Names: []string{format.PROBE}, Group: &probeFormat},
},
})
}
const (
compressionMethodNone = 0
compressionMethodShrunk = 1
compressionMethodReducedCompressionFactor1 = 2
compressionMethodReducedCompressionFactor2 = 3
compressionMethodReducedCompressionFactor3 = 4
compressionMethodReducedCompressionFactor4 = 5
compressionMethodImploded = 6
compressionMethodDeflated = 8
compressionMethodEnhancedDeflated = 9
compressionMethodPKWareDCLImploded = 10
compressionMethodBzip2 = 12
compressionMethodLZMA = 14
compressionMethodIBMTERSE = 18
compressionMethodIBMLZ77z = 19
compressionMethodPPMd = 98
)
var compressionMethodMap = decode.UToStr{
compressionMethodNone: "None",
compressionMethodShrunk: "Shrunk",
compressionMethodReducedCompressionFactor1: "ReducedCompressionFactor1",
compressionMethodReducedCompressionFactor2: "ReducedCompressionFactor2",
compressionMethodReducedCompressionFactor3: "ReducedCompressionFactor3",
compressionMethodReducedCompressionFactor4: "ReducedCompressionFactor4",
compressionMethodImploded: "Imploded",
compressionMethodDeflated: "Deflated",
compressionMethodEnhancedDeflated: "EnhancedDeflated",
compressionMethodPKWareDCLImploded: "PKWareDCLImploded",
compressionMethodBzip2: "Bzip2",
compressionMethodLZMA: "LZMA",
compressionMethodIBMTERSE: "IBMTERSE",
compressionMethodIBMLZ77z: "IBMLZ77z",
compressionMethodPPMd: "PPMd",
}
var (
centralDirectorySignature = []byte("PK\x01\x02")
endOfCentralDirectorySignature = []byte("PK\x05\x06")
endOfCentralDirectorySignatureN = 0x06054b50
localFileSignature = []byte("PK\x03\x04")
dataIndicatorSignature = []byte("PK\x07\x08")
)
var headerIDMap = decode.UToScalar{
0x0001: {Description: "ZIP64 extended information extra field"},
0x0007: {Description: "AV Info"},
0x0009: {Description: "OS/2 extended attributes"},
0x000a: {Description: "NTFS (Win9x/WinNT FileTimes)"},
0x000c: {Description: "OpenVMS"},
0x000d: {Description: "Unix"},
0x000f: {Description: "Patch Descriptor"},
0x0014: {Description: "PKCS#7 Store for X.509 Certificates"},
0x0015: {Description: "X.509 Certificate ID and Signature for individual file"},
0x0016: {Description: "X.509 Certificate ID for Central Directory"},
0x0065: {Description: "IBM S/390 attributes - uncompressed"},
0x0066: {Description: "IBM S/390 attributes - compressed"},
0x07c8: {Description: "Info-ZIP Macintosh (old, J. Lee)"},
0x2605: {Description: "ZipIt Macintosh (first version)"},
0x2705: {Description: "ZipIt Macintosh v 1.3.5 and newer (w/o full filename)"},
0x334d: {Description: "Info-ZIP Macintosh (new, D. Haase's 'Mac3' field )"},
0x4154: {Description: "Tandem NSK"},
0x4341: {Description: "Acorn/SparkFS (David Pilling)"},
0x4453: {Description: "Windows NT security descriptor (binary ACL)"},
0x4704: {Description: "VM/CMS"},
0x470f: {Description: "MVS"},
// "inofficial" in original table
//nolint:misspell
0x4854: {Description: "Theos, old inofficial port"},
0x4b46: {Description: "FWKCS MD5 (see below)"},
0x4c41: {Description: "OS/2 access control list (text ACL)"},
0x4d49: {Description: "Info-ZIP OpenVMS (obsolete)"},
0x4d63: {Description: "Macintosh SmartZIP, by Macro Bambini"},
0x4f4c: {Description: "Xceed original location extra field"},
0x5356: {Description: "AOS/VS (binary ACL)"},
0x5455: {Description: "extended timestamp"},
0x5855: {Description: "Info-ZIP Unix (original; also OS/2, NT, etc.)"},
0x554e: {Description: "Xceed unicode extra field"},
0x6542: {Description: "BeOS (BeBox, PowerMac, etc.)"},
0x6854: {Description: "Theos"},
0x756e: {Description: "ASi Unix"},
0x7855: {Description: "Info-ZIP Unix (new)"},
0x7875: {Description: "UNIX UID/GID"},
0xfb4a: {Description: "SMS/QDOS"},
}
// "MS-DOS uses year values relative to 1980 and 2 second precision."
func fieldMSDOSTime(d *decode.D) {
d.FieldU5("hours")
d.FieldU6("minutes")
d.FieldU5("seconds")
}
func fieldMSDOSDate(d *decode.D) {
d.FieldU7("year")
d.FieldU4("month")
d.FieldU5("day")
}
func zipDecode(d *decode.D, in interface{}) interface{} {
// TODO: just decode instead?
if !bytes.Equal(d.PeekBytes(4), []byte("PK\x03\x04")) {
d.Errorf("expected PK header")
}
d.Endian = decode.LittleEndian
d.SeekAbs(d.Len())
// TODO: better EOCD probe
p, _, err := d.TryPeekFind(32, -8, -10000, func(v uint64) bool {
return v == uint64(endOfCentralDirectorySignatureN)
})
if err != nil {
d.Fatalf("can't find end of central directory")
}
d.SeekAbs(d.Len() + p)
var offsetCD uint64
var sizeCD uint64
var diskNr uint64
d.FieldStruct("end_of_central_directory", func(d *decode.D) {
d.FieldRawLen("signature", 4*8, d.ValidateBitBuf(endOfCentralDirectorySignature))
diskNr = d.FieldU16("disk_nr")
d.FieldU16("central_directory_start_disk_nr")
d.FieldU16("nr_of_central_directory_records_on_disk")
d.FieldU16("nr_of_central_directory_records")
sizeCD = d.FieldU32("size_of_central directory")
offsetCD = d.FieldU32("offset_of_start_of_central_directory")
commentLength := d.FieldU16("comment_length")
d.FieldUTF8("comment", int(commentLength))
})
var localFileOffsets []uint64
d.SeekAbs(int64(offsetCD) * 8)
d.FieldArray("central_directories", func(d *decode.D) {
d.LenFn(int64(sizeCD)*8, func(d *decode.D) {
for !d.End() {
d.FieldStruct("central_directory", func(d *decode.D) {
d.FieldRawLen("signature", 4*8, d.ValidateBitBuf(centralDirectorySignature))
d.FieldU16("version_made_by")
d.FieldU16("version_needed")
d.FieldStruct("flags", func(d *decode.D) {
// TODO: 16LE, should have some kind of native endian flag reader helper?
d.FieldU1("unused0")
d.FieldBool("strong_encryption")
d.FieldBool("compressed_patched_data")
d.FieldBool("enhanced_deflation")
d.FieldBool("data_descriptor")
d.FieldBool("compression0")
d.FieldBool("compression1")
d.FieldBool("encrypted")
d.FieldU2("reserved0")
d.FieldBool("mask_header_values")
d.FieldBool("reserved1")
d.FieldBool("language_encoding")
d.FieldU3("unused1")
})
d.FieldU16("compression_method", d.MapUToStrSym(compressionMethodMap))
d.FieldStruct("last_modification_date", fieldMSDOSTime)
d.FieldStruct("last_modification_time", fieldMSDOSDate)
d.FieldU32("crc32_uncompressed", d.Hex)
d.FieldU32("compressed_size")
d.FieldU32("uncompressed_size")
fileNameLength := d.FieldU16("file_name_length")
extraFieldLength := d.FieldU16("extra_field_length")
fileCommentLength := d.FieldU16("file_comment_length")
diskNrStart := d.FieldU16("disk_number_where_file_starts")
d.FieldU16("internal_file_attributes")
d.FieldU32("external_file_attributes")
localFileOffset := d.FieldU32("relative_offset_of_local_file_header")
d.FieldUTF8("file_name", int(fileNameLength))
d.FieldArray("extra_fields", func(d *decode.D) {
d.LenFn(int64(extraFieldLength)*8, func(d *decode.D) {
for !d.End() {
d.FieldStruct("extra_field", func(d *decode.D) {
d.FieldU16("header_id", d.MapUToScalar(headerIDMap), d.Hex)
dataSize := d.FieldU16("data_size")
d.FieldRawLen("data", int64(dataSize)*8)
})
}
})
})
d.FieldUTF8("file_comment", int(fileCommentLength))
if diskNrStart == diskNr {
localFileOffsets = append(localFileOffsets, localFileOffset)
}
})
}
})
})
d.FieldArray("local_files", func(d *decode.D) {
for _, o := range localFileOffsets {
d.SeekAbs(int64(o) * 8)
d.FieldStruct("local_file", func(d *decode.D) {
var hasDataDescriptor bool
d.FieldRawLen("signature", 4*8, d.ValidateBitBuf(localFileSignature))
d.FieldU16("version_needed")
d.FieldStruct("flags", func(d *decode.D) {
// TODO: 16LE, should have some kind of native endian flag reader helper?
d.FieldU1("unused0")
d.FieldBool("strong_encryption")
d.FieldBool("compressed_patched_data")
d.FieldBool("enhanced_deflation")
hasDataDescriptor = d.FieldBool("data_descriptor")
d.FieldBool("compression0")
d.FieldBool("compression1")
d.FieldBool("encrypted")
d.FieldU2("reserved0")
d.FieldBool("mask_header_values")
d.FieldBool("reserved1")
d.FieldBool("language_encoding")
d.FieldU3("unused1")
})
compressionMethod := d.FieldU16("compression_method", d.MapUToStrSym(compressionMethodMap))
d.FieldStruct("last_modification_date", fieldMSDOSTime)
d.FieldStruct("last_modification_time", fieldMSDOSDate)
d.FieldU32("crc32_uncompressed", d.Hex)
compressedSize := d.FieldU32("compressed_size")
d.FieldU32("uncompressed_size")
fileNameLength := d.FieldU16("file_name_length")
extraFieldLength := d.FieldU16("extra_field_length")
d.FieldUTF8("file_name", int(fileNameLength))
d.FieldArray("extra_fields", func(d *decode.D) {
d.LenFn(int64(extraFieldLength)*8, func(d *decode.D) {
for !d.End() {
d.FieldStruct("extra_field", func(d *decode.D) {
d.FieldU16("header_id", d.MapUToScalar(headerIDMap), d.Hex)
dataSize := d.FieldU16("data_size")
d.FieldRawLen("data", int64(dataSize)*8)
})
}
})
})
compressedLimit := int64(compressedSize) * 8
if compressedLimit == 0 {
compressedLimit = d.BitsLeft()
}
compressedStart := d.Pos()
d.LenFn(compressedLimit, func(d *decode.D) {
if compressionMethod == compressionMethodNone {
d.FieldRawLen("uncompressed", int64(compressedSize)*8)
return
}
var decompressR io.Reader
compressedBB := d.BitBufRange(d.Pos(), d.BitsLeft())
switch compressionMethod {
case compressionMethodDeflated:
// *bitio.Buffer implements io.ByteReader so hat deflate don't do own
// buffering and might read more than needed messing up knowing compressed size
decompressR = flate.NewReader(compressedBB)
}
if decompressR != nil {
uncompressed := &bytes.Buffer{}
if _, err := d.Copy(uncompressed, decompressR); err != nil {
d.IOPanic(err)
}
uncompressedBB := bitio.NewBufferFromBytes(uncompressed.Bytes(), -1)
dv, _, _ := d.FieldTryFormatBitBuf("uncompressed", uncompressedBB, probeFormat, nil)
if dv == nil {
d.FieldRootBitBuf("uncompressed", uncompressedBB)
}
// no compressed size, is a streaming zip, figure out size by checking what
// position compressed buffer ended at
if compressedSize == 0 {
pos, err := compressedBB.Pos()
if err != nil {
d.IOPanic(err)
}
compressedSize = uint64(pos) / 8
}
}
if compressedSize != 0 {
d.FieldRawLen("compressed", int64(compressedSize)*8)
}
})
d.SeekAbs(compressedStart + int64(compressedSize*8))
if hasDataDescriptor {
d.FieldStruct("data_indicator", func(d *decode.D) {
if bytes.Equal(d.PeekBytes(4), dataIndicatorSignature) {
d.FieldRawLen("signature", 4*8, d.ValidateBitBuf(dataIndicatorSignature))
}
d.FieldU32("crc32_uncompressed", d.Hex)
d.FieldU32("compressed_size")
d.FieldU32("uncompressed_size")
})
}
})
}
})
return nil
}

View File

@ -166,6 +166,13 @@ func (b *Buffer) Read(p []byte) (n int, err error) {
return b.br.Read(p)
}
// required by some decompressors (like deflate) to not do own buffering
func (b *Buffer) ReadByte() (byte, error) {
var rb [1]byte
_, err := b.br.Read(rb[:])
return rb[0], err
}
func (b *Buffer) Seek(offset int64, whence int) (int64, error) {
return b.br.Seek(offset, whence)
}

View File

@ -357,11 +357,19 @@ func (d *D) TryPeekFind(nBits int, seekBits int64, maxLen int64, fn func(v uint6
return 0, 0, err
}
found := false
var count int64
if seekBits < 0 {
count = int64(-nBits)
if _, err := d.bitBuf.SeekBits(start+count, io.SeekStart); err != nil {
return 0, 0, err
}
}
found := false
var v uint64
for {
if maxLen >= 0 && count >= maxLen {
if (seekBits > 0 && maxLen > 0 && count >= maxLen) || (seekBits < 0 && maxLen > 0 && count < -maxLen) {
break
}
v, err = d.TryU(nBits)

View File

@ -118,6 +118,7 @@ vpx_ccr VPX Codec Configuration Record
wav WAV file
webp WebP image
xing Xing header
zip ZIP archive
$ fq -X
exitcode: 2
stderr: