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

时间:2014-03-31 20:41:51

标签: sockets flex websocket bytearray deflate

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

我得到了

  

错误#2058:解压缩数据时出错

当线路上的数据很大并且调用byteArray的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()

之前,我想弄清楚如何确保所有数据都存在

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

如何使用ByteArray API查找该标头?

1 个答案:

答案 0 :(得分:1)

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

我不能说你正在使用的API,但通常zlib的接口允许一次给膨胀对象输入一段deflate流。充气机将告诉您何时到达压缩数据的末尾,并且在放气流之后您将留下未使用的字节。