diff --git a/Project.toml b/Project.toml index 28a38dd..00e70ba 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "ZipArchives" uuid = "49080126-0e18-4c2a-b176-c102e4b3760c" authors = ["nhz2 "] -version = "2.5.1" +version = "2.6.0-dev" [deps] ArgCheck = "dce04be8-c92d-5529-be00-80e4d2c0e197" diff --git a/src/ZipArchives.jl b/src/ZipArchives.jl index 11fb866..aa9b393 100644 --- a/src/ZipArchives.jl +++ b/src/ZipArchives.jl @@ -79,6 +79,7 @@ export zip_findlast_entry export zip_comment export zip_compression_method export zip_general_purpose_bit_flag +export zip_version_made_by export zip_entry_data_offset export zip_test_entry diff --git a/src/reader.jl b/src/reader.jl index e76140a..781fa6a 100644 --- a/src/reader.jl +++ b/src/reader.jl @@ -161,6 +161,19 @@ for a description of the bits. """ zip_general_purpose_bit_flag(x::HasEntries, i::Integer)::UInt16 = x.entries[i].bit_flags +""" + zip_version_made_by(x::HasEntries, i::Integer)::UInt16 + +Return the "version made by" field for entry `i`. + +See https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT +for a description of this field. +""" +function zip_version_made_by(x::HasEntries, i::Integer)::UInt16 + e = x.entries[i] + UInt16(e.version_made) | UInt16(e.os)<<8 +end + """ zip_iscompressed(x::HasEntries, i::Integer)::Bool diff --git a/test/test_reader.jl b/test/test_reader.jl index 4ee3e97..4d70caa 100644 --- a/test/test_reader.jl +++ b/test/test_reader.jl @@ -170,6 +170,14 @@ end @test zip_compressed_size(r, 1) === UInt64(compressed_size) end +@testset "version made by" begin + testdata = joinpath(@__DIR__,"examples from go/testdata/") + r = ZipReader(read(joinpath(testdata, "utf8-osx.zip"))) + @test zip_version_made_by(r, 1) === 0x0315 + r = ZipReader(read(joinpath(testdata, "utf8-7zip.zip"))) + @test zip_version_made_by(r, 1) === 0x003f +end + @testset "reading file with zip64 disk number" begin invalid_data1 = b"PK\x03\x04-\0\0\b\0\0\0\0\0\0\x13\xec\x8d_\xff\xff\xff\xff\xff\xff\xff\xff\x04\0\x14\0test\x01\0\x10\0\t\0\0\0\0\0\0\0\t\0\0\0\0\0\0\0file dataPK\x01\x02?\x03-\0\0\b\0\0\0\0\0\0\x13\xec\x8d_\xff\xff\xff\xff\xff\xff\xff\xff\x04\0 \0\0\0\xff\xff\0\0\0\0\xa4\x81\xff\xff\xff\xfftest\x01\0\x18\0\t\0\0\0\0\0\0\0\t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0PK\x06\x06,\0\0\0\0\0\0\0?\x03-\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0R\0\0\0\0\0\0\0?\0\0\0\0\0\0\0PK\x06\a\0\0\0\0\x91\0\0\0\0\0\0\0\x01\0\0\0PK\x05\x06\0\0\0\0\x01\0\x01\0R\0\0\0?\0\0\0\0\0" invalid_data2 = b"PK\x03\x04-\0\0\b\0\0\0\0\0\0\x13\xec\x8d_\xff\xff\xff\xff\xff\xff\xff\xff\x04\0\x14\0test\x01\0\x10\0\t\0\0\0\0\0\0\0\t\0\0\0\0\0\0\0file dataPK\x01\x02?\x03-\0\0\b\0\0\0\0\0\0\x13\xec\x8d_\xff\xff\xff\xff\xff\xff\xff\xff\x04\0 \0\0\0\xff\xff\0\0\0\0\xa4\x81\xff\xff\xff\xfftest\x01\0\x18\0\t\0\0\0\0\0\0\0\t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0PK\x06\x06,\0\0\0\0\0\0\0?\x03-\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0R\0\0\0\0\0\0\0?\0\0\0\0\0\0\0PK\x06\a\0\0\0\0\x91\0\0\0\0\0\0\0\x01\0\0\0PK\x05\x06\0\0\0\0\x01\0\x01\0R\0\0\0?\0\0\0\0\0"