04 00 00 80 08 00 00 0C 00 18 00 00 00 00 00 00 00 00 00 B4 81 00 00 00 00 50 65 72 73 6F 6E 2E 63 6C 61 73 73 55 54 05 00 03 8A 44 71 52 75 78 0B 00 01 04 E8 03 00 00 04 E8 03 00 00 50 4B 01 02 1E 03 14 00 00 00 08 00 53 71 61 43 77 E4 43 50 16 7D 0A 00 BC C4 0A 00 08 00 18 00 00 00 00 00 00 00 00 00 B4 81 76 04 00 00 74 65 73 74 2E 67 69 66 55 54 05 00 03 3E 9A 73 52 75 78 0B 00 01 04 E8 03 00 00 04 E8 03 00 00 50 4B 05 06 00 00 00 00 02 00 02 00 A0 00 00 00 CE 81 0A 00 00 00
Ну и собственно пример выше, разобранный чуть подробнее:
50 4B 03 04 //сигнатура хедера локального файла, читать как 0x04034b50
14 00 // version needed to extract, зависит от фич, использованных при
// создании архива, в основном различные алгоритмы сжатия
// 0x14 соответствует версия 2.0
00 00 // general purpose bit flag - свалка различных флагов. Некоторые используются
// разными алгоритмами, некоторые не используются вообще, некоторые зарезервированы
08 00 // метод сжатия, в данном случае Deflate
0D 9D и 5E 43 // DOS-время последней модификации файла, см. структуру FILETIME в WinAPI
33 C3 3A 4D // CRC-32 файла
30 04 00 00 // размер сжатого файла, 1072 байт
80 08 00 00 // размер исходного файла, 2176 байт
0C 00 // совершенно верно, длина имени файла
1C 00 // длина дополнительного поля
50 65 72 73 6F 6E 2E 63 6C 61 73 73 // собственно искомое имя файла. Никакого юникода, старый добрый ASCII
Надеюсь это помогло, если остались вопросы - задавайте, я в своё время немало головной боли помел с зип-файлами.
import java.io.FileInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class LsZip {
public static void main(String[] args) throws Exception {
byte[] zipBytes = ...;
ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(zipBytes));
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
// здесь делайте то, что вам требуется с entry.getName()
}
}
}
50 4B 03 04 14 00 00 00 08 00 0D 9D 5E 43 33 C3 3A 4D 30 04 00 00 80 08 00 00 0C 00 1C 00 50 65 72 73 6F 6E 2E 63 6C 61 73 73
PK..........^C3Ã:M0...........Person.class
Судя по комментариям выше, вы уже во всём разобрались (кроме порядка байтов). В целом всё верно, нужно пройтись по всем local file header и достать из них имя. В качестве примера посоветовал бы почитать исодники minizip, входящей в состав zlib.
В частности https://github.com/madler/zlib/blob/master/contrib/minizip/miniunz.c#L234 и подробней о парсинге хедера в https://github.com/madler/zlib/blob/master/contrib/minizip/unzip.c#L1136
Это не Java а C, но, учитывая что вещи довольно низкоуровневые, понять можно.