Raju Yadav
Raju Yadav

Reputation: 57

Create Zip with java program and while unzip using Golang, getting issue as "zlib: invalid header"

I am having two application one written in java where required to zip string of data and other in golang and required to unzip the record zipped by first application

Java program to Creating Zipped of string data

public static byte[] createZipForLicenses(String string) throws UnsupportedEncodingException {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
    zipOutputStream.setLevel(Deflater.DEFAULT_COMPRESSION);

    try {

        if (string != null && string.length() > 0) {
            ZipEntry zipEntry = new ZipEntry("data");
            zipOutputStream.putNextEntry(zipEntry);
            zipOutputStream.write(string.getBytes("UTF-8"));
            zipOutputStream.closeEntry();
        }

        zipOutputStream.close();

    } catch (IOException e) {

    }
    return outputStream.toByteArray();
}

Golang program to unzip the string data

func Unzip(data []byte) (string, error) {

rdata := bytes.NewReader(data)
r, err := zlib.NewReader(rdata) //**Error**-> "zlib: invalid header 
if err != nil {
    return "", err
}
s, err := io.ReadAll(r)
if err != nil {
    return "", err
}
return string(s), nil

}

I tried using compress/flate lib also but with this getting error "flate: corrupt input before offset 5"

Upvotes: 1

Views: 392

Answers (2)

Raju Yadav
Raju Yadav

Reputation: 57

func Unzip(data []byte) (string, error) {
zipReader, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
if err != nil {
    panic(err)
}
if len(zipReader.File) == 0 {
    return "", nil // No file to open / extract
}
f, err := zipReader.File[0].Open()
if err != nil {
    panic(err)
}
p, err := ioutil.ReadAll(f)
if err != nil {
    return "", err
}
return string(p), nil

}

Upvotes: 1

Oleg Cherednik
Oleg Cherednik

Reputation: 18245

Java part looks good to me:

public static byte[] createZipForLicenses(String string) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ZipOutputStream zipOutputStream = new ZipOutputStream(out);
    zipOutputStream.setLevel(Deflater.DEFAULT_COMPRESSION);

    if (string != null && string.length() > 0) {
        ZipEntry zipEntry = new ZipEntry("data");
        zipOutputStream.putNextEntry(zipEntry);
        zipOutputStream.write(string.getBytes("UTF-8"));
        zipOutputStream.closeEntry();
    }

    zipOutputStream.close();

    return out.toByteArray();
}

And am able to read this zip with WinZip. And this is a zip info:

(PK0506) End of Central directory record
========================================
    - location:                                     116 (0x00000074) bytes
    - size:                                         22 bytes
    part number of this part (0000):                1
    part number of start of central dir (0000):     1
    number of entries in central dir in this part:  1
    total number of entries in central dir:         1
    size of central dir:                            50 (0x00000032) bytes
    relative offset of central dir:                 66 (0x00000042) bytes
    zipfile comment length:                         0 bytes

(PK0102) Central directory
==========================
    - location:                                     66 (0x00000042) bytes
    - size:                                         54 bytes
    total entries:                                  1

#1 (PK0102) [UTF-8] data
------------------------
    - location:                                     66 (0x00000042) bytes
    - size:                                         50 bytes
    part number of this part (0000):                1
    relative offset of local header:                0 (0x00000000) bytes
    version made by operating system (00):          MS-DOS, OS/2, NT FAT
    version made by zip software (20):              2.0
    operat. system version needed to extract (00):  MS-DOS, OS/2, NT FAT
    unzip software version needed to extract (20):  2.0
    general purpose bit flag (0x0808) (bit 15..0):  0000.1000 0000.1000
      file security status  (bit 0):                not encrypted
      data descriptor       (bit 3):                yes
      strong encryption     (bit 6):                no
      UTF-8 names          (bit 11):                yes
    compression method (08):                        deflated
      compression sub-type (deflation):             normal
    file last modified on (0x5563 0x542A):          2022-11-03 10:33:20
    32-bit CRC value:                               0x373555E7
    compressed size:                                16 bytes
    uncompressed size:                              14 bytes
    length of filename:                             4
                                                    UTF-8
    64 61 74 61                                     data
    length of file comment:                         0 bytes
    internal file attributes:                       0x0000
      apparent file type:                           binary
    external file attributes:                       0x00000000
      WINDOWS   (0x00):                             none
      POSIX (0x000000):                             ?---------

(PK0304) ZIP entries
====================
    total entries:                                  1

#1 (PK0304) [UTF-8] data
------------------------
    - location:                                     0 (0x00000000) bytes
    - size:                                         34 bytes
    operat. system version needed to extract (00):  MS-DOS, OS/2, NT FAT
    unzip software version needed to extract (20):  2.0
    general purpose bit flag (0x0808) (bit 15..0):  0000.1000 0000.1000
      file security status  (bit 0):                not encrypted
      data descriptor       (bit 3):                yes
      strong encryption     (bit 6):                no
      UTF-8 names          (bit 11):                yes
    compression method (08):                        deflated
      compression sub-type (deflation):             normal
    file last modified on (0x5563 0x542A):          2022-11-03 10:33:20
    32-bit CRC value:                               0x00000000
    compressed size:                                0 bytes
    uncompressed size:                              0 bytes
    length of filename:                             4
                                                    UTF-8
    64 61 74 61                                     data

#1 (PK0708) Data descriptor
---------------------------
    - location:                                     50 (0x00000032) bytes
    - size:                                         16 bytes
    32-bit CRC value:                               0x373555E7
    compressed size:                                16 bytes
    uncompressed size:                              14 bytes

Looks like you unzip it with Go incorrectly.

P.S. To avoid a lot of code when zip/unzip files in java, you can use zip4jvm

Upvotes: -1

Related Questions