Конструктор, который вы вызываете, делает неочевидным, что двоичные преобразования в строки используют декодирование: String(byte[] bytes, Charset charset)
. То, что вы хотите, это вообще не использовать декодирование.
К счастью, для этого есть конструктор: String(char[] value)
.
Теперь у вас есть данные в виде строки, но вы хотите вернуть их точно так же, как есть. Но угадайте что! getBytes(Charset charset)
Правильно, автоматически применяется и кодировка. К счастью, есть метод toCharArray()
.
Если вы должны начинать с байтов и заканчивать байтами, вам необходимо сопоставить массивы символов с байтами:
(new String(Array[Byte](1,2,3,-1,-2,-127).map(_.toChar))).toCharArray.map(_.toByte)
Итак, подведем итог: преобразование между String
и Array[Byte]
включает в себя кодирование и декодирование. Если вы хотите поместить двоичные данные в строку, вы должны сделать это на уровне символов. Обратите внимание, однако, что это даст вам строку мусора (то есть результат не будет правильно сформирован UTF-16, как ожидается String
), и поэтому вам лучше прочитать его как символы и преобразовать его обратно в байты.
Вы могли бы сдвинуть байты, скажем, добавив 512; тогда вы получите кучу действительных Char
кодовых точек. Но это использует 16 бит для представления каждых 8, 50% эффективности кодирования. Base64 - лучший вариант для сериализации двоичных данных (8 бит для представления 6, эффективность 75%).