package main
import (
"compress/gzip"
// "archive/zip"
"bytes"
"encoding/base64"
"fmt"
"io"
"log"
)
func main() {
// 输入 Base64 压缩字符串
// 客户 Gzip
// input := "H4sIAAAAAAAAAEtMSjY0MgYAXLsCzwYAAAA="
// 客户 Zip
// input := "UEsDBBQACAgIADeji1kAAAAAAAAAAAAAAAABAAAAMEtMSjY0MgYAUEsHCFy7As8IAAAABgAAAA=="
// Java Gzip
input := "UEsDBBQACAgIAFmijFkAAAAAAAAAAAAAAAABAAAAMKtWSs5PSVWyUjIwNDRQ0lHKKc4AcpISTS3SjAxNDAyTzA1SjUyNDBINk9MMUlJNLNJSzExBCnNTi4sT00E6X86d92zz1GdTNzzrXadUCwBQSwcIBTEK308AAABRAAAAUEsBAhQAFAAICAgAWaKMWQUxCt9PAAAAUQAAAAEAAAAAAAAAAAAAAAAAAAAAADBQSwUGAAAAAAEAAQAvAAAAfgAAAAAA"
// Java Zip
// input := "UEsDBBQACAgIAEFcjFkAAAAAAAAAAAAAAAABAAAAMEtMSjY0MgYAUEsHCFy7As8IAAAABgAAAA=="
// Go Gzip
// input := "H4sIAAAAAAAA/0pMSjY0MgYEAAD//1y7As8GAAAA"
// Go Zip
// input := "UEsDBBQACAAIAAAAAAAAAAAAAAAAAAAAAAABAAAAMEpMSjY0MgYEAAD//1BLBwhcuwLPDAAAAAYAAABQSwECFAAUAAgACAAAAAAAXLsCzwwAAAAGAAAAAQAAAAAAAAAAAAAAAAAAAAAAMFBLBQYAAAAAAQABAC8AAAA7AAAAAAA="
// 调用解压方法
result, err := unzipDecode(input, true)
if err != nil {
log.Fatalf("Failed to decode and unzip: %v", err)
}
// 输出解压后的结果
fmt.Println("Decoded and Unzipped String:")
fmt.Println(result)
}
func unzipDecode(zipStr string, isZip bool) (string, error) {
// Base64 解码
decoded, err := base64.StdEncoding.DecodeString(zipStr)
if err != nil {
return "", fmt.Errorf("failed to decode base64: %w", err)
}
if isZip {
// 解压缩
return decompress(decoded)
}
// 不解压直接返回字符串
return string(decoded), nil
}
// Gzip
func decompress(compressed []byte) (string, error) {
reader := bytes.NewReader(compressed)
gzReader, err := gzip.NewReader(reader)
if err != nil {
return "", fmt.Errorf("failed to create gzip reader: %w", err)
}
defer gzReader.Close()
var buf bytes.Buffer
_, err = io.Copy(&buf, gzReader)
if err != nil {
return "", fmt.Errorf("failed to decompress: %w", err)
}
return buf.String(), nil
}
// Zip
// func decompress(compressed []byte) (string, error) {
// // 创建一个字节流读取器
// reader := bytes.NewReader(compressed)
// // 使用 zip.NewReader 解读数据流
// zipReader, err := zip.NewReader(reader, int64(len(compressed)))
// if err != nil {
// return "", fmt.Errorf("failed to create zip reader: %w", err)
// }
// // 遍历压缩包中的条目,提取第一个文件的内容
// for _, file := range zipReader.File {
// if file.Name == "0" { // 匹配条目名为 "0"
// rc, err := file.Open()
// if err != nil {
// return "", fmt.Errorf("failed to open zip entry: %w", err)
// }
// defer rc.Close()
// // 读取文件内容
// var buf bytes.Buffer
// if _, err := io.Copy(&buf, rc); err != nil {
// return "", fmt.Errorf("failed to read zip entry: %w", err)
// }
// return buf.String(), nil
// }
// }
// return "", fmt.Errorf("no matching entry found in zip")
// }