String 将字节数组中的压缩数据转换为字符串

String 将字节数组中的压缩数据转换为字符串,string,scala,compression,byte,zlib,String,Scala,Compression,Byte,Zlib,假设我有一个名为cmp的数组[Byte]val cmp=Array[Byte](120,-100)。 现在,newstring(cmp)给出了x�

假设我有一个名为
cmp
数组[Byte]
val cmp=Array[Byte](120,-100)
。 现在,
newstring(cmp)
给出了
x�
给出的
数组(120,-17,-65,-67)
不等于原始的
数组[字节](120,-100)
-100
的这个字节是通过使用Zlib压缩一些字符串而获得的
数组[byte]
的一部分


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

当您有任意二进制数据时,千万不要试图将其转换为字符串,就好像它实际上是文本数据,已使用常规编码(如UTF-8)编码为二进制数据一样。(即使您有文本数据,在调用
String
构造函数或
getBytes()
时也要指定编码)否则,这就像试图将mp3加载到图像编辑器中,并在它看起来不像正确的图片时发牢骚一样


基本上,您应该使用base64来实现这一点。周围有很多base64编码器;我喜欢它,因为它有一个非常合理的界面。或者,您可以使用十六进制-如果您希望能够轻松地从文本表示中手动理解原始二进制内容,那么十六进制的可读性会更高,但会占用更多空间(每个原始1字节2个字符,而每个原始3字节4个字符)。

更像Java,但是可以使用
java.io.ByteArrayInputStream
java.util.zip.InflaterInputStream
java.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

知道了!谢谢你能帮我弄清楚在我的特殊情况下我能做些什么来处理不使用
String
s吗。我使用的是Spark的KafkaUtils'consumer,它返回一个
,其中的每个元素都是字符串。那么,我必须编写一个自定义方法来处理任意二进制数据吗?@KamalBanga:恐怕我对此一无所知——我建议你提出一个新问题,重点就是这个问题。恭喜你。我花了一些时间来理解Base64是如何提供帮助的。现在所有的谜题都解决了:)。没有,但是如果我有一些任意数据被转换成
String
,我想要它回来呢?@KamalBanga补充了关于它的描述,这真的很有帮助。但是当我尝试做第一部分时,它给了我
java.io.EOFException:ZLIB输入流的意外结束
。I其中
压缩
。另外,
compress
似乎还可以,因为
新字符串(解压(compress(“simple-complex-ough.getBytes))
返回
simple-complex-ough
。任何帮助都将不胜感激:)。您还可以解释一下,如何将任意二进制数据编码为字符串,并从字符串中获取二进制数据。感谢您的回复。但我觉得使用Jon Skeet提到的Base64更舒服,它解决了我的问题。