为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信