convert a byte array to string
51,103
Solution 1
You could convert the byte array to a char array, and then construct a string from that
scala> val bytes = Array[Byte]('a','b','c','d')
bytes: Array[Byte] = Array(97, 98, 99, 100)
scala> (bytes.map(_.toChar)).mkString
res10: String = abcd
scala>
Solution 2
You can always convert the byte array to a string if you know its charset,
val str = new String(bytes, StandardCharsets.UTF_8)
And the default Charset
would used if you don't specify any.
Related videos on Youtube
Author by
Robin
Updated on November 21, 2020Comments
-
Robin over 3 years
My Scala code received a binary from byte stream,it looks like [61 62 63 64].The content is "abcd". I use toString to convert it p, but failed. How do I print it as string ?
-
Quentin almost 7 yearsTry to parse each number as a char and concate them to have a string
-
Sameera.San almost 7 years
-
Alexander Azarov almost 7 yearsPossible duplicate of Byte array to String and back.. issues with -127
-
-
BAE about 6 yearsCurious which method is better,
(bytes.map(_.toChar)).mkString
ornew String(bytes)
? -
Micheal Hill about 6 years@BAE this is perhaps a bit late for you; but the two could potentially produce different results. UTF-8 is a variable width encoding, so a single character could be encoded with a single byte or multiple. UTF-8 encodes ASCII characters in the same way (eg.
A
is represented by65
in both) but most (maybe all?) other characters with multiple bytes. In short; they're the same if your string contains only ASCII characters but otherwise will produce different results. -
cms about 6 years@MichealHill assuming that the stream is a UTF-8 stream is a fairly reasonable for text payloads nowadays. The original question asked to print out a 'binary' byte stream, this particular case does not imply a string encoding. This is why it's best to provide an encoding when you're transmitting strings. (You can use frequency analysis to infer a probable string encoding if you have a text stream with no indicated encoding)
-
Murray Todd Williams almost 6 yearsAs @michael-hill already mentioned in a comment below, this can cause problems because it assumes you're working in ASCII and not UTF-8 or some other character encoding. If you were to try to convert the following (proper) UTF-8 byte array to a String...
val msg = Array[Byte](-17, -69, -65, 72, 101, 108, 108, 111)
(msg.map(_.toChar)).mkString
You would get something that looked very weird and not the expected "Hello" that you would get from this:new String(msg)
-
jwvh over 3 yearsTwo things: 1-I don't see what all the type conversions are for. Why not just
bytes.mkString(" ")
? and 2-This answer is out of place. It doesn't answer the question asked. -
Jacob Wang over 3 yearsAs @cms said, this is really bad advice. Please don't do this. This can lead to silent data corruption and other hard to track down bugs
-
tgrrr about 2 years
println("🍕".getBytes(StandardCharsets.UTF_8).length)
> 4