gpt4 book ai didi

php - Go中如何实现PHP的gzopen?

转载 作者:数据小太阳 更新时间:2023-10-29 03:32:14 26 4
gpt4 key购买 nike

我必须将 PHP 脚本转换为 Go,现在遇到了一个问题(我预见会有更多问题)。

在脚本中,它使用 gzopen打开 .gz 和非 .gz 文件,然后获取读取的数据并返回它的 MD5 哈希版本。我尝试过使用 zlib.NewReader、gzip.NewReader 甚至 flate,但它们都不起作用。有人能指出我正确的方向吗?

file, err := os.Open("somefile.dat")
if err != nil {
return err
}

// rc := flate.NewReader(f) //error: corrupt input before offset 5
// rc, err := zlib.NewReader(f) //error: invalid header
// rc, err := gzip.NewReader(f) //error: invalid header
if err != nil {
return err
}

buffer := make([]byte, 4096)
rc.Read(buffer)

注意:关于转换为 MD5 哈希,我遵循了示例 here我最初使用 md5.Sum() 但它返回了一个 [Size]byte,其中 Size 是 16bytes,这不是我需要的。我必须将 MD5 校验和转换为 32 个字符的十六进制字符串,以匹配我需要的校验和。希望这对其他人有帮助。

最佳答案

由于您需要支持从 gzip 和非 gzip 文件读取,添加一个检查以查看 if gzip.NewReader 是否返回 ErrHeader 错误。如果返回,回退到正常读取文件:

file, err := os.Open("somefile.dat")
if err != nil {
return err
}

var rc io.ReadCloser
if gz, err := gzip.NewReader(file); err == gzip.ErrHeader {
if _, err := file.Seek(0, io.SeekStart); err != nil {
return err
}
rc = file
} else if err == nil {
rc = gz
} else {
return err
}

md5sum := md5.New()
if _, err := io.Copy(md5sum, rc); err != nil {
return err
}

if err := rc.Close(); err != nil {
return err
}

// TODO: md5sum.Sum

关于php - Go中如何实现PHP的gzopen?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57559374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com