gpt4 book ai didi

go - 如何从 golang 中的 gzip 或纯文本阅读器读取?

转载 作者:IT王子 更新时间:2023-10-29 01:27:38 25 4
gpt4 key购买 nike

我正在用 golang 编写一个小型网络应用程序,它涉及解析用户上传的文件。我想自动检测文件是否压缩,并适本地创建阅读器/扫描仪。一个转折是我无法将整个文件读入内存,我只能单独对流进行操作。这是我得到的:

func scannerFromFile(reader io.Reader) (*bufio.Scanner, error) {

var scanner *bufio.Scanner
//create a bufio.Reader so we can 'peek' at the first few bytes
bReader := bufio.NewReader(reader)

testBytes, err := bReader.Peek(64) //read a few bytes without consuming
if err != nil {
return nil, err
}
//Detect if the content is gzipped
contentType := http.DetectContentType(testBytes)

//If we detect gzip, then make a gzip reader, then wrap it in a scanner
if strings.Contains(contentType, "x-gzip") {
gzipReader, err := gzip.NewReader(bReader)
if (err != nil) {
return nil, err
}

scanner = bufio.NewScanner(gzipReader)

} else {
//Not gzipped, just make a scanner based on the reader
scanner = bufio.NewScanner(bReader)
}

return scanner, nil
}

这对于纯文本工作正常,但对于 gzip 数据它膨胀不正确,几 kb 后我不可避免地得到乱码文本。那里有更简单的方法吗?任何想法为什么在几千行之后它解压缩不正确?

最佳答案

您可以通过检查前 2 个字节是否等于 0x1f8b 来检测文件是否已压缩(我发现了信息 here )。

在评论中有人提到你应该分别检查这些字节,所以第一个是0x1f,第二个是0x8b

testBytes, err := bReader.Peek(2) //read 2 bytes
....
if testBytes[0] == 31 && testBytes[1] == 139 {
//gzip
}else{
...
}

希望对您有所帮助。

关于go - 如何从 golang 中的 gzip 或纯文本阅读器读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28309988/

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