登录
首页 >  Golang >  Go问答

Swift 和 Go 的 Zlib 压缩对比

来源:stackoverflow

时间:2024-03-15 09:45:26 180浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《Swift 和 Go 的 Zlib 压缩对比》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我的 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."

// compression
var b bytes.buffer
writer := zlib.newwriter(&b)
writer.write([]byte(sourcestring))
writer.close()

// base 64
b64 := base64.stdencoding.encodetostring(b.bytes())

fmt.println(b64)

它给出了以下内容(go 演示):

ejwczb2tg0aqrefwbkbylhaecjy4i/fykuyalev5ixd1fs6pzre1bdqjxoxtb/zfkp2b6aylgx9svxmmp80e8yyhedneq33fcxffykgcool3etthgl5um/u/pbj9yes9jduoqrzg8ryz2vvz1 m8aaad//++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.allocate(capacity: sourceString.count)

let algorithm = COMPRESSION_ZLIB

let 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̶t̶d̶v̶v̶7̶0̶=̶ hc0xdsmwdeprq3dzuuckryysvyxqmiaawxftkunpx6ctlwf+nxumgfhmolvitxleoda645r7xfokm/obtddo6ji6mejqvucvrofshyeo4xpetkxzgmqm/yhnurkh35fjblgjwxg97xz5+newwhw==

正如你所看到的,这是非常不同的,我在这里做错了什么?


解决方案


我不熟悉 Swift,但 Go 代码返回一个 zlib (RFC 1950) 压缩字符串,而根据 Apple 的文档,Swift 代码最多应该返回一个 deflate 压缩字符串 (RFC 1951),即像 zlib 一样压缩但没有 2 字节 zlib 标头。

有了这些知识,从 Go 代码返回的字符串可以正确解压缩,而从 Swift 返回的字符串则不能。大小的差异也很明显,这让我假设有些东西被切断了。看起来您将压缩数据 destinationBuffer 视为 cString,这意味着字符串内的任何 \0-byte 将被视为字符串的结尾。压缩结果很可能存在这样的 \0 字节,并且字符串在那里被切断,即您的输出仅显示真实 destinationBuffer 的一部分。 (编辑:最后一部分不再适用,因为OP以正确的结果更改了问题)。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Swift 和 Go 的 Zlib 压缩对比》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>