public void initialize(byte[] src) throws IOException {
        int uSize = ((src[0] & 0xFF) << 16) | 
                    ((src[1] & 0xFF) << 8)  | 
                     (src[2] & 0xFF);
        int cSize = ((src[3] & 0xFF) << 16) | 
                    ((src[4] & 0xFF) << 8)  | 
                     (src[5] & 0xFF);
        if(cSize != uSize) {
            archiveData = new byte[uSize];
            DataInputStream is = new DataInputStream(new BZip2CompressorInputStream(new ByteArrayInputStream(src, 6, src.length)));
            is.readFully(archiveData);
            is.close();
            isCompressed = true;
        } else {
            archiveData = src;
            isCompressed = false;
        }
        amountEntries = ((archiveData[!isCompressed ? 6 : 0] & 0xFF) << 8) |
                         (archiveData[!isCompressed ? 7 : 1] & 0xFF);
        nameHashes = new int[amountEntries];
        uSizes = new int[amountEntries];
        cSizes = new int[amountEntries];
        archiveOffsets = new int[amountEntries];
        int dataOffset = isCompressed ? 2 : 8;
        int offset = dataOffset + amountEntries * 10;
        for(int i = 0; i < amountEntries; i++) {
            nameHashes[i] = ((archiveData[dataOffset++] & 0xFF) << 24) |
                            ((archiveData[dataOffset++] & 0xFF) << 16) | 
                            ((archiveData[dataOffset++] & 0xFF) << 8)  | 
                             (archiveData[dataOffset++] & 0xFF);
            uSizes[i] = ((archiveData[dataOffset++] & 0xFF) << 16) | 
                        ((archiveData[dataOffset++] & 0xFF) << 8)  | 
                         (archiveData[dataOffset++] & 0xFF);
            cSizes[i] = ((archiveData[dataOffset++] & 0xFF) << 16) | 
                        ((archiveData[dataOffset++] & 0xFF) << 8)  | 
                         (archiveData[dataOffset++] & 0xFF);
            archiveOffsets[i] = offset;
            offset += cSizes[i];
        }
    }