ZipEntry中的额外字节有什么用?

时间:2019-02-12 16:04:49

标签: java zip zipfile

Zip文件的Java库在getExtra()ZipEntry中有一个选项,可以返回byte[]null。 ZipEntry中用于额外的字节是什么?我知道this question关于链接到getExtra()的存档属性,但没有解释该字段还用于什么用途。此外,该问题表明,无法通过Java设置多余字段中存储的某些内容。

1 个答案:

答案 0 :(得分:0)

答案可以在the java.util.zip package documentation的前两个链接中找到。

the PKWARE zip specification中描述了基本的zip格式。 4.5和4.6节描述了额外的数据。

额外数据是一系列零个或多个块。每个块均以低端16位ID开始,然后是紧随其后的字节的低端16位计数。

PKWARE规范描述了一些众所周知的额外数据记录ID。 Info-Zip format描述了更多。

因此,如果要检查zip条目是否包含ASi Unix Extra域,则可以这样阅读:

ByteBuffer extraData = ByteBuffer.wrap(zipEntry.getExtra());
extraData.order(ByteOrder.LITTLE_ENDIAN);

while (extraData.hasRemaining()) {
    int id = extraData.getShort() & 0xffff;
    int length = extraData.getShort() & 0xffff;

    if (id == 0x756e) {
        int crc32 = extraData.getInt();
        short permissions = extraData.getShort();
        int linkLengthOrDeviceNumbers = extraData.getInt();
        int userID = extraData.getChar();
        int groupID = extraData.getChar();

        ByteBuffer linkDestBuffer = extraData.slice().limit(length - 14);
        String linkDestination =
            StandardCharsets.UTF_8.decode(linkDestBuffer).toString();

        // ...
    } else {
        extraData.position(extraData.position() + length);
    }
}