2

I need to uncompress a git object which is compressed with zlib. Although the object is compressed with zlib it has no header(to save bandwidth I guess). So I'm trying to add the header on top of the object bytes but for some reasons zlib still complains that the header is not valid. I suspect the header bytes are added as string literal instead of bytes but I'm not sure. See the code below.

package main

import(
        "compress/zlib"
        "io/ioutil"
        "bytes"
        "fmt"
        //      "strings"
)


func main(){
        b, err := ioutil.ReadFile("raw")
        if err !=nil{
                panic(err)
        }
        const header = "\x1f\x8b\x08\x00\x00\x00\x00\x00"
        buf := bytes.NewBuffer(nil)
        if _, err := buf.WriteString(header); err !=nil{
                panic(err)
        }
        if _, err := buf.Write(b); err !=nil{
                panic(err)
        }
        r, err := zlib.NewReader(buf)
        if err !=nil{
                panic(err)
        }
        defer r.Close()
        var db []byte
        if _, err := r.Read(db); err !=nil{
                panic(err)
        }
        fmt.Printf("%s", db)
}

Error

panic: zlib: invalid header

goroutine 1 [running]:
main.main()
    /Users/themihai/test/main.go:27 +0x29e
exit status 2
The user with no hat
  • 10,166
  • 20
  • 57
  • 80
  • 2
    Where did you get that header value? Most zlib headers start with 0x78, and are only two bytes long. See http://stackoverflow.com/questions/9050260/what-does-a-zlib-header-look-like for more details. – djd Feb 05 '16 at 02:28

1 Answers1

7

That's a gzip header, not a zlib header.

But you don't need to add a zlib header anyway. If it is raw deflate data, then use the compress/flate package instead of compress/zlib.

Mark Adler
  • 101,978
  • 13
  • 118
  • 158