将压缩数据以字节数组转换为字符串

时间:2014-12-17 15:07:36

标签: string scala compression byte zlib

假设我有一个名为Array[Byte]的{​​{1}}。 cmp。 现在,val cmp = Array[Byte](120, -100)提供了new String(cmp),而x�提供了(new String(cmp)).getBytes,它不等于原始Array(120, -17, -65, -67)Array[Byte](120, -100)的这个字节是通过使用Zlib压缩一些字符串获得的-100的一部分。

注意:这些操作是在Scala的重复中完成的。

2 个答案:

答案 0 :(得分:2)

当您获得任意二进制数据时,永远永远尝试将其转换为字符串,就好像它实际上是使用正常数据编码为二进制数据的文本数据一样编码如UTF-8。 (即使你有文本数据,也要在调用String构造函数或getBytes()时指定编码。)否则就像尝试加载mp3一样一个图像编辑器,并抱怨它看起来不像一个正确的图片...

基本上,您可能应该使用base64。有很多base64编码器;我喜欢this public domain one,因为它有一个非常明智的界面。或者,您可以使用十六进制 - 如果您希望能够轻松地从文本表示中手动理解原始二进制内容,则会更具可读性,但会占用更多空间(每个原始1字节需要2个字符,相对于base64'每个原始3个字节的4个字符)。

答案 1 :(得分:0)

更像是Java,但可以使用java.io.ByteArrayInputStreamjava.util.zip.InflaterInputStreamjava.io.DataInputStream

import java.io._

val bis = new ByteArrayInputStream(cmp)
val zis = new InflaterInputStream(bis)
val dis = new DataInputStream(zis)
val str = dis.readUTF()

要倒退,

val bos = new ByteArrayOutputStream()
val zos = new InflaterOutputStream(bos)
val dos = new DataOutputStream(zos)
dos.writeUTF(str)
val cmp = bos.toArray