编辑代码

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")
// }