问题描述
用于 Zip 文件的 Java 库在ZipEntry
有一个用于的选项,该选项返回byte[]
或null
。
ZipEntry 中的额外字节用于什么?
我知道关于链接到getExtra()
存档属性的,但它没有解释该字段的其他用途。
此外,问题表明存储在额外字段中的某些内容无法从 Java 设置。
1楼
答案可以在的前两个链接中找到。
描述了基本的 zip 格式。 第 4.5 和 4.6 节描述了额外数据是什么。
额外数据是一系列零个或多个块。 每个块以小端 16 位 ID 开头,后跟小端 16 位字节计数。
PKWARE 规范描述了一些众所周知的额外数据记录 ID。 描述了更多内容。
所以,如果你想检查一个 zip 条目是否包含一个 ASi Unix Extra Field,你可以这样读:
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);
}
}