当前位置: 首页 > 面试题库 >

PHP无法通过Golang解压缩gzip数据

潘振国
2023-03-14
问题内容

为什么在我的PHP演示中无法通过Go解压缩gzip数据,但是成功将PHP gzip数据解压到Go?我需要从Go to PHP API服务发布gzip
JSON数据。

测试结果

 -> |  php   |  go 
---------------------
php |  ok    |  ok
go  |  fail  |  ok

PHP代码

class GzipDemo
{
    public function gzen($data, $file){
       $json_data = json_encode($data);
       $gz_data = gzencode($json_data,9);
       file_put_contents($file,$gz_data);
    }

    public function gzdn($file){
       $data = file_get_contents($file);
        $unpacked = gzdecode($data);
        if ($unpacked === FALSE)
        {
            print("failed:".$file."\n");
        }else{
             print($file. " result Data :".$unpacked ."\n");
        }
    }
}

$demo = new GzipDemo();
$file="phpgzip.txt";
$demo->gzen("data",$file);
$demo->gzdn($file);
$demo->gzdn("gogzip.txt");

结果是:PHP到PHP可以。转到PHP失败。

去代码

package main

import (
    "bytes"
    "compress/gzip"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "os"
)

func main() {
    gzen("data", "gogzip.txt")
    gden("gogzip.txt")
    gden("phpgzip.txt")
}
func gzen(data string, file string) {
    b, _ := json.Marshal(data)
    buffer := new(bytes.Buffer)
    w, _ := gzip.NewWriterLevel(buffer, gzip.BestCompression)
    defer w.Close()
    w.Write(b)
    w.Flush()
    ioutil.WriteFile(file, buffer.Bytes(), os.ModePerm)
}
func gden(file string) {
    b, _ := ioutil.ReadFile(file)
    buffer := new(bytes.Buffer)
    buffer.Write(b)
    r, _ := gzip.NewReader(buffer)
    defer r.close()
    data, _ := ioutil.ReadAll(r)
    fmt.Println(file, " result Data:", string(data))
}

结果是:转到好的。PHP可以了。


问题答案:

它适用于以下更改:

  • 在您的PHP代码中,您想使用gzdecode而不是gzinflatesubstr($data, 10)如果您使用它,则不需要这些东西。我没有读过deflate与gzip的关系,但简单之处在于gzencode/ gzdecode匹配golang gzip软件包的功能以及gz*GNU命令行工具系列的功能。
  • 在您的Go代码中,移动gzip.Writer.Close()调用以在从中读取之前完成buffer。如您在这里看到的:http : //golang.org/src/compress/gzip/gzip.go?s=6230 : 6260#L240还有一些其他内容在关闭时会写入基础流,因此在您的示例中以上您所写的内容是不完整的。(该defer语句导致Close()在包含函数退出后运行。)很可能Go gzip解码无论如何都会设法解码,而PHP实现却无法解码-在任何情况下,您都应正确关闭流到内存缓冲区中以确保它是在将其写到文件之前完成。

强制性注释:您将忽略Go代码中的所有错误。这段代码看起来只是一个测试,所以我不会太在意这一点,但是您绝对希望进行适当的错误处理(将问题报告给用户或函数的调用者)。



 类似资料:
  • 问题内容: 我有一堆来自某些Web请求的文件,有些文件是gzip压缩的,我需要将它们解压缩并将其打印为字符串。这是我第一次尝试使用golang,尝试了一些在网上找到的示例,但无法正常使用。 这是我尝试的最后一个测试: 但它显示了错误:panic:,与其他一些示例相同。 如何解压缩字节数组的内容? 问题答案: 这根本不是gzip数据。正确的gzip数据以魔术序列开头,即。就此而言,它正确地抱怨 gz

  • 我想在JavaScript中做解压缩图像。我已经用C#使用gzip压缩了图像。如何在JavaScript中解压缩gzipped数据? C#代码

  • 问题内容: 我正在使用php的功能来执行HTTP请求。为了节省带宽,我决定使用添加标题。 显然,输出一个gzip编码的字符串,所以我用来解码该编码的字符串,但是将作为参数传递的数据出错。 我知道还有另一个功能可以解压缩压缩后的数据,但是它不包含在我的PHP版本中(也许仅在SVN上可用)。 我知道cUrl可以即时解码gzip流(没有任何问题),但是有人建议我使用它而不是cUrl。 您是否知道以其他方

  • 问题内容: 我正在通过curl检索gzip压缩的网页,但是当我将检索到的内容输出到浏览器时,我只是得到了原始的gzip压缩数据。如何在PHP中解码数据? 我发现的一种方法是将内容写入tmp文件,然后… ....但是,人,一定有更好的方法。 编辑:这不是文件,而是Web服务器返回的gzip压缩html页面。 问题答案: 我使用curl和:

  • 问题内容: 我有一个内存和磁盘受限的环境,我需要解压缩以字符串为基础的块(通过xmlrpc二进制传输)发送给我的gzip文件的内容。但是,使用zlib.decompress()或zlib.decompressobj()/ decompress()都可以在gzip标头上使用barf。我已经尝试过偏移gzip标头(在此处记录),但是仍然没有避免使用barf。gzip库本身似乎仅支持从文件解压缩。 以下