亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Swift 和 Go 之間的 Zlib 壓縮

Swift 和 Go 之間的 Zlib 壓縮

Go
FFIVE 2023-06-26 16:50:11
我的 Swift 應用程序與用 Go 編寫的服務器進行通信。我希望使用 Zlib 來壓縮傳輸的數據,但壓縮結果似乎與 Swift 和 Go 不同。這是Go版本:sourceString := "A-t-elle besoin d'autres preuves ? Acceptez-la pour le plaisir. J'ai tant fait que de la cueillir, Et c'est presque une fleur-des-veuves."// Compressionvar b bytes.Bufferwriter := zlib.NewWriter(&b)writer.Write([]byte(sourceString))writer.Close()// Base 64b64 := base64.StdEncoding.EncodeToString(b.Bytes())fmt.Println(b64)它給出了以下內容(Go Playground):eJwczb2tg0AQRefWbkbylhaeCJy4i/FykUYaLev5IXD1Fs6Pzre1bDQjXoxTB/ZFKp2B6ayLgX9svXMmP80E8yyHEdNEQ33FcxFFykgcool3ETthgl5UM/U/PBJ9YeS9jDuoQRzG8rYz2v Vz1m8AAAD//++yMFQ=現在使用以下Swift代碼(基于本文):let sourceString = "A-t-elle besoin d'autres preuves ? Acceptez-la pour le plaisir. J'ai tant fait que de la cueillir, Et c'est presque une fleur-des-veuves."var sourceBuffer = Array(sourceString.utf8)let destinationBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: sourceString.count)let algorithm = COMPRESSION_ZLIBlet compressedSize = compression_encode_buffer(destinationBuffer, sourceString.count, &sourceBuffer, sourceString.count, nil, algorithm)if compressedSize == 0 {    fatalError("Encoding failed.")}// EDIT after @Steffen Ullrich answer// let encodedString = String(cString: destinationBuffer)// let encodedStringb64 = Data(encodedString.utf8).base64EncodedString()let encodedData = NSData(bytesNoCopy: destinationBuffer, length: compressedSize)let encodedStringb64 = encodedData.base64EncodedString()print(encodedStringb64)我們得到:H?e?+?/?v?T?E?O?7?7?+?9?M?A?x?D?0?a?t?w?7?7?+?9?U?u?+?/?v?Q?p?F?7?7?+?9?L?O?+?/?v ?e?+?/?v?e?+?/?v?e?+?/?T?D?v?v?7?0?=? Hc0xDsMwDEPR q3DzUucKRYYsvYXqMIAAwXFtKUNPX6cTlwf+NXumGfHmOLViTxLeOdA645r7xFoKm/O bTdDO6Ji6mejQvuCVROFSHYeo4xPETkxZgmqm/YHNURKH35fjBlGJwxg97xz5+newWHw==正如你所看到的,這是非常不同的,我在這里做錯了什么?
查看完整描述

1 回答

?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

我不熟悉 Swift,但 Go 代碼返回一個 zlib (RFC 1950) 壓縮字符串,而根據 Apple 的文檔,Swift 代碼最多應該返回一個 deflate 壓縮字符串 (RFC 1951),即像 zlib 壓縮但沒有2 字節 zlib 標頭。

有了這些知識,從 Go 代碼返回的字符串可以正確解壓縮,而從 Swift 返回的字符串則不能。大小的差異也很明顯,這讓我假設有些東西被切斷了。看起來您將壓縮數據destinationBuffer視為 a?cString,這意味著\0字符串內的任何 -byte 將被視為字符串的結尾。此類字節很可能是\0由于壓縮而存在,并且字符串在那里被截斷,即您的輸出僅顯示真實destinationBuffer.?

查看完整回答
反對 回復 2023-06-26
  • 1 回答
  • 0 關注
  • 220 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號