gpt4 book ai didi

sockets - 使用 Deflate 压缩数据查找 block 标记 Flash ByteArray 的结尾

转载 作者:行者123 更新时间:2023-12-03 12:05:24 25 4
gpt4 key购买 nike

我有一些通过 Web 套接字发送到 Flash 客户端的数据。该数据在发送到客户端之前使用 Java Deflate 类进行压缩。

我得到一个

Error #2058: There was an error decompressing the data



当通过网络传输的数据很大并调用 byteArray 的 deflate 方法时

Deflate 服务器上的代码(Scala):
def deflate(str:String):Array[Byte] = {
val data = str.getBytes
val deflater = new Deflater(9, true)
deflater.setInput(data)

val outputStream = new ByteArrayOutputStream(data.length)
deflater.finish
val buffer = new Array[Byte](1024)
while(!deflater.finished) {
val count = deflater.deflate(buffer)
outputStream.write(buffer, 0, count)
}
outputStream.close
val output = outputStream.toByteArray
output
}

发送给客户端:
def sendToClient(message:String) {
println("original message length: " + message.length)
val compressed = deflate(message)
//wrap the compressed data in base64 encoded string because of a requirement for this on the client
val toClient = Base64.encodeBase64String(compressed)
clientConnection.sendMessage(toClient)
}

客户:
//read the data into the ByteArray
while(socket.bytesAvaialble > 4) {
//unwrap base64 encoded stuff
myByteArray[position] = socket.readUnsignedByte();
}

//inflate the data in the ByteArray
myByteArray.inflate();

当来自 websocket 的数据很大时,对 inflate 的调用会失败,因为并非所有数据都在那里。在调用 inflate() 之前,我想弄清楚如何确保所有数据都在那里

根据 this (第 9 页),我应该寻找一个 block 头来确定所有压缩内容何时到达。

如何使用 ByteArray API 查找该 header ?

最佳答案

找到放气流结束的唯一方法是给它充气。例如,通过简单地查看某些位或字节模式,结尾并不明显。 deflate 流中的所有表和代码都需要按顺序解码,直到遇到结尾。

我不能代表您正在使用的 API,但通常 zlib 的接口(interface)允许一次向充气对象提供一段放气流。当压缩数据结束时,inflator 会告诉您,并且您将在放气流之后留下未使用的字节。

关于sockets - 使用 Deflate 压缩数据查找 block 标记 Flash ByteArray 的结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22771759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com