Go:zlib解压缩字节片
我试图解析一个文件,它由许多单独压缩的片段组成。我已经将这些段一次一个地解析成一个字节片,我想在进行时解压缩它们 这是我当前执行解压缩的代码,但不起作用<代码>从和到仅设置在顶部作为示例,实际上它们是由代码设置的Go:zlib解压缩字节片,go,Go,我试图解析一个文件,它由许多单独压缩的片段组成。我已经将这些段一次一个地解析成一个字节片,我想在进行时解压缩它们 这是我当前执行解压缩的代码,但不起作用从和到仅设置在顶部作为示例,实际上它们是由代码设置的data是包含整个文件的字节数组。我不想在它位于磁盘上时查找它,因为它位于另一台服务器上,所以我只需要先将整个文件加载到[]字节,然后解析它 from, to := 0, 1000; b := bytes.NewReader(data[from:from+to]) z, err := zlib.
data
是包含整个文件的字节数组。我不想在它位于磁盘上时查找它,因为它位于另一台服务器上,所以我只需要先将整个文件加载到[]字节,然后解析它
from, to := 0, 1000;
b := bytes.NewReader(data[from:from+to])
z, err := zlib.NewReader(b)
CheckErr(err)
defer z.Close()
p := make([]byte,0,1024)
z.Read(p)
fmt.Println(string(p))
那么,仅仅解压缩一段字节怎么会如此困难呢?无论如何
问题似乎与我如何读出它有关。上面写着z.Read的地方,看起来什么都没做
如何在一个字节片中读取整个内容?使用io/ioutil
包中的ReadAll(r io.Reader)([]字节,错误)
p, err := ioutil.ReadAll(b)
fmt.Println(string(p))
只读取给定片的长度(在您的情况下为1024字节)
要读取1024字节的数据块,请执行以下操作:
p := make([]byte,1024)
for {
numBytes, err := l.Read(p)
if err == io.EOF {
// you are done, numBytes might be less than len(p)
break
}
// do what you want with p
}
如果您是从Web服务器获取数据,您甚至可以这样做
import (
"net/http"
"io/ioutil"
)
...
resp, errGet := http.Get("http://example.com/somefile")
// do error handling
z, errZ := zlib.NewReader(resp.Body)
// do error handling
resp.Body.Close()
p, err := ioutil.ReadAll(b)
// do error handling
因为resp.Body恰巧是一个io.Reader,就像大多数io相关类型一样。这里有一个提纲供您参考。注意:在Go中,检查错误
package main
import (
"bytes"
"compress/zlib"
"fmt"
"io/ioutil"
)
func readSegment(data []byte, from, to int) ([]byte, error) {
b := bytes.NewReader(data[from : from+to])
z, err := zlib.NewReader(b)
if err != nil {
return nil, err
}
defer z.Close()
p, err := ioutil.ReadAll(z)
if err != nil {
return nil, err
}
return p, nil
}
func main() {
from, to := 0, 1000
data := make([]byte, from+to)
// ** parse input segments into data **
p, err := readSegment(data, from, to)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(p))
}
您检查了一次到多次错误…:-)大体上