Kotlin compress/deflate 字符串到服务器不工作
Kotlin compress/deflate string to server not working
相当多 questions/answers 和许多我都尝试过但没有成功。我收到一个压缩字符串,它使用 MemoryStream 和 DeflateStream 来执行此操作 (c#)。下面的解压功能可以正常使用
fun decompress(string: String): String? {
var decompressedString: String? = ""
try {
val bytes: ByteArray = Base64.decode(string, Base64.DEFAULT)
val inflater = Inflater(true)
val outputStream = ByteArrayOutputStream()
val buffer = ByteArray(1024)
inflater.setInput(bytes)
while (!inflater.finished()) {
val count = inflater.inflate(buffer)
outputStream.write(buffer, 0, count)
}
inflater.end()
outputStream.close()
decompressedString = outputStream.toString("UTF8")
} catch (e: IOException) {
e.printStackTrace()
}
return decompressedString
}
稍后我需要压缩数据并发回。压缩数据的尝试没有成功。服务器一直告诉我 "block length does not match with its complement." 我使用以下函数进行压缩
fun compress(string: String): String? {
var compressedString: String? = null
try {
val bytes: ByteArray = string.toByteArray(charset("UTF-8"))
// Compress the bytes
val deflater = Deflater()
//val outputStream = ByteArrayOutputStream()
val buffer = ByteArray(1024)
deflater.setInput(bytes)
deflater.finish()
deflater.deflate(buffer)
deflater.end()
//outputStream.close()
compressedString = Base64.encodeToString(buffer, Base64.DEFAULT)
} catch (e: IOException) {
e.printStackTrace()
}
return compressedString
}
问题不在于服务器端,因为它适用于 iOS 应用程序但不适用于 Android。我已经尝试了很多变体,但都没有成功。
有人对我做错了什么以及我需要做什么才能让它工作有任何建议吗?
谢谢^.^
以防其他人遇到这个问题。我能够通过将 deflate 函数更改为
来解决它
var compressedString: String? = ""
val bytes: ByteArray = string.toByteArray(charset("UTF-8"))
val deflater = Deflater(1, true)
deflater.setInput(bytes)
deflater.finish()
val outputStream = ByteArrayOutputStream(bytes.size)
try {
val bytesCompressed = ByteArray(Short.MAX_VALUE.toInt())
val numberOfBytesAfterCompression = deflater.deflate(bytesCompressed)
val returnValues = ByteArray(numberOfBytesAfterCompression)
System.arraycopy(bytesCompressed, 0, returnValues, 0, numberOfBytesAfterCompression)
compressedString = Base64.encodeToString(returnValues, Base64.DEFAULT)
} catch (e: IOException) {
e.printStackTrace()
} finally {
deflater.end()
outputStream.close()
}
从这里获得deflater examples site。
显然使用之前的函数会增加 2 个字节,这就是导致问题的原因。更改后,不添加 2 个字节。我不太明白如何或为什么如果有人知道并希望分享,请这样做。
相当多 questions/answers 和许多我都尝试过但没有成功。我收到一个压缩字符串,它使用 MemoryStream 和 DeflateStream 来执行此操作 (c#)。下面的解压功能可以正常使用
fun decompress(string: String): String? {
var decompressedString: String? = ""
try {
val bytes: ByteArray = Base64.decode(string, Base64.DEFAULT)
val inflater = Inflater(true)
val outputStream = ByteArrayOutputStream()
val buffer = ByteArray(1024)
inflater.setInput(bytes)
while (!inflater.finished()) {
val count = inflater.inflate(buffer)
outputStream.write(buffer, 0, count)
}
inflater.end()
outputStream.close()
decompressedString = outputStream.toString("UTF8")
} catch (e: IOException) {
e.printStackTrace()
}
return decompressedString
}
稍后我需要压缩数据并发回。压缩数据的尝试没有成功。服务器一直告诉我 "block length does not match with its complement." 我使用以下函数进行压缩
fun compress(string: String): String? {
var compressedString: String? = null
try {
val bytes: ByteArray = string.toByteArray(charset("UTF-8"))
// Compress the bytes
val deflater = Deflater()
//val outputStream = ByteArrayOutputStream()
val buffer = ByteArray(1024)
deflater.setInput(bytes)
deflater.finish()
deflater.deflate(buffer)
deflater.end()
//outputStream.close()
compressedString = Base64.encodeToString(buffer, Base64.DEFAULT)
} catch (e: IOException) {
e.printStackTrace()
}
return compressedString
}
问题不在于服务器端,因为它适用于 iOS 应用程序但不适用于 Android。我已经尝试了很多变体,但都没有成功。
有人对我做错了什么以及我需要做什么才能让它工作有任何建议吗?
谢谢^.^
以防其他人遇到这个问题。我能够通过将 deflate 函数更改为
来解决它var compressedString: String? = ""
val bytes: ByteArray = string.toByteArray(charset("UTF-8"))
val deflater = Deflater(1, true)
deflater.setInput(bytes)
deflater.finish()
val outputStream = ByteArrayOutputStream(bytes.size)
try {
val bytesCompressed = ByteArray(Short.MAX_VALUE.toInt())
val numberOfBytesAfterCompression = deflater.deflate(bytesCompressed)
val returnValues = ByteArray(numberOfBytesAfterCompression)
System.arraycopy(bytesCompressed, 0, returnValues, 0, numberOfBytesAfterCompression)
compressedString = Base64.encodeToString(returnValues, Base64.DEFAULT)
} catch (e: IOException) {
e.printStackTrace()
} finally {
deflater.end()
outputStream.close()
}
从这里获得deflater examples site。
显然使用之前的函数会增加 2 个字节,这就是导致问题的原因。更改后,不添加 2 个字节。我不太明白如何或为什么如果有人知道并希望分享,请这样做。