我有 []byte 的 zip 檔案。我必須在不創建新檔案的情況下解壓縮它,并獲取該解壓縮檔案的 [] 位元組。請幫我這樣做。
我正在進行 API 呼叫,我得到的回應是壓縮格式的 []byte - 我正在嘗試解壓縮它 - 并使用它的內容來創建新的 zip 檔案。所以解壓縮 - 重新壓縮。
語言:戈朗
我用過的代碼:
func UnzipBytes(zippedBytes []byte) ([]byte, error) {
reader := bytes.NewReader(zippedBytes)
zipReader, err := zlib.NewReader(reader)
if err != nil {
return nil, err
}
defer zipReader.Close()
p, err := ioutil.ReadAll(zipReader)
if err != nil {
return nil, err
}
return p, nil
}
我收到一條錯誤訊息“zlib:無效標頭”
最初用于壓縮 []byte 的代碼
buffer := new(bytes.Buffer)
zipWriter := zip.NewWriter(buffer)
zipFile, err := zipWriter.Create(file.name)
_, err = zipFile.Write(file.content)
[]byte 的十六進制轉儲 - zippedBytes
00059350 78 b4 5b 0d 2b 81 c2 87 35 76 1b 11 4a ec 07 d1 |x.[. ...5v..J...|
00059360 76 77 a2 e1 3b d9 12 e2 51 d4 c5 bd 4b 2f 09 da |vw..;...Q...K/..|
00059370 f7 21 c7 26 73 1f 8e da f0 ff a3 52 f6 e2 00 e6 |.!.&s......R....|
uj5u.com熱心網友回復:
你用來zip.Writer
壓縮資料。你必須通過呼叫它的Writer.Close()
方法來關閉它。并且您必須使用zip.Reader
它來閱讀它,并使用Reader.Open()
與壓縮時相同的名稱(file.name
)。
這就是它的樣子:
func UnzipBytes(name string, zippedBytes []byte) ([]byte, error) {
reader := bytes.NewReader(zippedBytes)
zipReader, err := zip.NewReader(reader, int64(len(zippedBytes)))
if err != nil {
return nil, err
}
f, err := zipReader.Open(name)
if err != nil {
panic(err)
}
p, err := ioutil.ReadAll(f)
if err != nil {
return nil, err
}
return p, nil
}
測驗它:
filename := "test.txt"
filecontent := []byte("line1\nline2")
buffer := new(bytes.Buffer)
zipWriter := zip.NewWriter(buffer)
zipFile, err := zipWriter.Create(filename)
if err != nil {
panic(err)
}
if _, err = zipFile.Write(filecontent); err != nil {
panic(err)
}
if err = zipWriter.Close(); err != nil {
panic(err)
}
decoded, err := UnzipBytes(filename, buffer.Bytes())
fmt.Println(err)
fmt.Println(string(decoded))
這將輸出(在Go Playground上嘗試):
<nil>
line1
line2
如果解壓時不知道名稱,可能會在檔案Reader.Files
頭欄位中看到所有檔案。您可以選擇打開第一個檔案:
func UnzipBytes(zippedBytes []byte) ([]byte, error) {
reader := bytes.NewReader(zippedBytes)
zipReader, err := zip.NewReader(reader, int64(len(zippedBytes)))
if err != nil {
return nil, err
}
if len(zipReader.File) == 0 {
return nil, nil // No file to open / extract
}
f, err := zipReader.File[0].Open()
if err != nil {
panic(err)
}
p, err := ioutil.ReadAll(f)
if err != nil {
return nil, err
}
return p, nil
}
這輸出相同。在Go Playground上試試這個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/508323.html