Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go:zlib解压缩字节片_Go - Fatal编程技术网

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))
}

您检查了一次到多次错误…:-)大体上