go - 如何用 Go 语言解压缩字符串
问题描述
我在下面有一些 Go 代码,其中包含 PK 压缩字符串。如何获取此 zip 字符串中每个文件的内容?
下面是使用字符串操作的尝试,我可以获得第一个文件的内容。是否有另一种方法可以在不使用字符串函数的情况下获取内容?
package main
import (
"fmt"
"strings"
)
func main() {
x := "PK\x03\x04\n\x00\x00\x00\x00\x00\x14OOQ\xddDYc\v\x00\x00\x00\v\x00\x00\x00\t\x00\x00\x00file1.txttextfileonePK\x03\x04\n\x00\x00\x00\x00\x00\x1aOOQq?\xb5]\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00file2.txttextfile2PK\x01\x02?\x00\n\x00\x00\x00\x00\x00\x14OOQ\xddDYc\v\x00\x00\x00\v\x00\x00\x00\t\x00$\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00file1.txt\n\x00 \x00\x00\x00\x00\x00\x01\x00\x18\x00#~\xfb\xa7\x85\xa2\xd6\x01#~\xfb\xa7\x85\xa2\xd6\x01\x00\xa8\xdfE\xe7\x8b\xd6\x01PK\x01\x02?\x00\n\x00\x00\x00\x00\x00\x1aOOQq?\xb5]\t\x00\x00\x00\t\x00\x00\x00\t\x00$\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x002\x00\x00\x00file2.txt\n\x00 \x00\x00\x00\x00\x00\x01\x00\x18\x00u\xa7v\xaf\x85\xa2\xd6\x01u\xa7v\xaf\x85\xa2\xd6\x01\xa8\x9eˏ\x85\xa2\xd6\x01PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\xb6\x00\x00\x00b\x00\x00\x00\x00\x00"
i := strings.Index(x , "PK")
right := x[i+1:]
i = strings.Index(right , "PK")
left := right[:i]
i = strings.LastIndex(left , ".txt")
file1contents := left[i+4:]
fmt.Println("file1contents : ", file1contents)
}
上述 file1contents 的输出:textfileone
解决方案
标准库中的zip包将为您执行此操作:
func main() {
z := []byte("PK\x03\x04\n\x00\x00\x00\x00\x00\x14OOQ\xddDYc\v\x00\x00\x00\v\x00\x00\x00\t\x00\x00\x00file1.txttextfileonePK\x03\x04\n\x00\x00\x00\x00\x00\x1aOOQq?\xb5]\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00file2.txttextfile2PK\x01\x02?\x00\n\x00\x00\x00\x00\x00\x14OOQ\xddDYc\v\x00\x00\x00\v\x00\x00\x00\t\x00$\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00file1.txt\n\x00 \x00\x00\x00\x00\x00\x01\x00\x18\x00#~\xfb\xa7\x85\xa2\xd6\x01#~\xfb\xa7\x85\xa2\xd6\x01\x00\xa8\xdfE\xe7\x8b\xd6\x01PK\x01\x02?\x00\n\x00\x00\x00\x00\x00\x1aOOQq?\xb5]\t\x00\x00\x00\t\x00\x00\x00\t\x00$\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x002\x00\x00\x00file2.txt\n\x00 \x00\x00\x00\x00\x00\x01\x00\x18\x00u\xa7v\xaf\x85\xa2\xd6\x01u\xa7v\xaf\x85\xa2\xd6\x01\xa8\x9eˏ\x85\xa2\xd6\x01PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\xb6\x00\x00\x00b\x00\x00\x00\x00\x00")
r, err := zip.NewReader(bytes.NewReader(z), int64(len(z)))
if err != nil {
panic(err)
}
for _, f := range r.File {
fmt.Printf("Contents of %s:\n", f.Name)
rc, err := f.Open()
if err != nil {
panic(err)
}
c, err := ioutil.ReadAll(rc)
if err != nil {
panic(err)
}
fmt.Printf("%s\n\n", c)
rc.Close()
fmt.Println()
}
}
在操场上试试
推荐阅读
- google-sheets - 如何将时间戳列附加到存档数据脚本
- bluetooth-lowenergy - BLE 广告是否需要提供非空本地名称?
- fonts - 字体在 Google 协作平台中显示不正确,但仅在发布到自定义域时才会显示
- javascript - 使用 React Fragment 将内联 CSS 添加到 JS 类
- python - 将 .py 文件转换为 .exe 后,我在 cmd 中收到致命错误消息
- python - 使用类中的插槽在 Python 中声明字典?
- c# - 在 Docker Compose 中使用 REST 调用访问其他服务
- python - Pandas:根据搜索多行值返回多列值
- swift - 如何设置 UIPickerView 的宽度
- python - 如何忽略其他渠道?