Как конвертировать Java String в байт []?


539

Есть ли способ конвертировать Java Stringв byte[]( не в штучной упаковке Byte[])?

В попытке это:

System.out.println(response.split("\r\n\r\n")[1]);
System.out.println("******");
System.out.println(response.split("\r\n\r\n")[1].getBytes().toString());

и я получаю отдельные выводы. Невозможно отобразить 1-й вывод, так как это строка gzip.

<A Gzip String>
******
[B@38ee9f13

Второй адрес. Что-то я делаю не так? Мне нужен результат byte[]для подачи его в распаковщик gzip, который выглядит следующим образом.

String decompressGZIP(byte[] gzip) throws IOException {
    java.util.zip.Inflater inf = new java.util.zip.Inflater();
    java.io.ByteArrayInputStream bytein = new java.io.ByteArrayInputStream(gzip);
    java.util.zip.GZIPInputStream gzin = new java.util.zip.GZIPInputStream(bytein);
    java.io.ByteArrayOutputStream byteout = new java.io.ByteArrayOutputStream();
    int res = 0;
    byte buf[] = new byte[1024];
    while (res >= 0) {
        res = gzin.read(buf, 0, buf.length);
        if (res > 0) {
            byteout.write(buf, 0, res);
        }
    }
    byte uncompressed[] = byteout.toByteArray();
    return (uncompressed.toString());
}


Извините, я пытаюсь преобразовать строку в bytearray и обратно и получаю неверный результат. Я отредактирую это через некоторое время и вернусь.
Mkl Rjv

9
Ваша проблема в том, что String.getBytes()он действительно возвращает байтовый массив, но ваша вера в то, что toString()байтовый массив вернет полезный результат, неверна.
Луи Вассерман

Ответы:


951

Объект, в котором decompressGZIP()нуждается ваш метод, это byte[].

Итак, основной технический ответ на заданный вами вопрос:

byte[] b = string.getBytes();
byte[] b = string.getBytes(Charset.forName("UTF-8"));
byte[] b = string.getBytes(StandardCharsets.UTF_8); // Java 7+ only

Однако проблема, с которой вы, похоже, боретесь, заключается в том, что это выглядит не очень хорошо. Вызов toString()по умолчанию просто даст вам Object.toString()имя класса + адрес памяти. В вашем результате [B@38ee9f13, то [Bзначит byte[]и 38ee9f13является адрес памяти, отделенный друг от друга @.

Для отображения вы можете использовать:

Arrays.toString(bytes);

Но это будет отображаться как последовательность целых чисел, разделенных запятыми, которые могут быть или не быть тем, что вы хотите.

Для того, чтобы получить читаемый Stringназад от byte[], используйте:

String string = new String(byte[] bytes, Charset charset);

Причиной Charsetпредпочтения версии является то, что все Stringобъекты в Java хранятся внутри как UTF-16. При преобразовании в a byte[]вы получите различную разбивку байтов для заданных символов String, в зависимости от выбранной кодировки.


26
string.getBytes ("UTF-8") требует обработки исключения UnsupportedEncodingException, а string.getBytes (Charset.forName ("UTF-8")) - нет. Споря о том, какой метод «лучше», я оставляю это упражнение для читателя.
Майкл Уорнер

20
string.getBytes(StandardCharsets.UTF_8)также может быть использован, и это то же самое, чтоstring.getBytes(Charset.forName("UTF-8"))
Бахадыр Яган

3
Я считаю, что StandardCharsetsэто ново с Java 7
Стюарт

2
Я не понимаю, почему этот ответ получил так много голосов. Это может быть правильно, но это не очень полезно ... просто пара строк кода, большая часть которых уже была у ОП, и не объясняющих, что Charset.forName("UTF-8")делает разницу или почему это важно.
LarsH

3
@LarsH Вы делаете хорошую мысль. Честно говоря, я никогда не ожидал, что этот ответ станет настолько популярным. Теперь я расширил ответ, чтобы «заслужить» голоса противников. Надеюсь, это улучшение.
Стюарт


14

Попробуйте использовать String.getBytes (). Возвращает byte [], представляющий строковые данные. Пример:

String data = "sample data";
byte[] byteData = data.getBytes();

14

Просто:

String abc="abcdefghight";

byte[] b = abc.getBytes();

Что делать, если abcне символы US-ASCII, например, "greater than 2³² − 1"или просто двоичные данные (например, « A b2»)?
У. Виндл

это не работает для символов, таких как эта строка имеет только 5 символов. Однако, когда я использую, getBytes()я получил 7 символов.
Teocci



1

Нет необходимости изменять Java в качестве параметра String. Вы должны изменить код c, чтобы получить строку без указателя и в своем коде:

Bool DmgrGetVersion (String szVersion);

Char NewszVersion [200];
Strcpy (NewszVersion, szVersion.t_str ());
.t_str () applies to builder c ++ 2010

1

Я знаю, что немного опоздал на вечеринку, но это работает довольно аккуратно (наш профессор дал нам это)

public static byte[] asBytes (String s) {                   
           String tmp;
           byte[] b = new byte[s.length() / 2];
           int i;
           for (i = 0; i < s.length() / 2; i++) {
             tmp = s.substring(i * 2, i * 2 + 2);
             b[i] = (byte)(Integer.parseInt(tmp, 16) & 0xff);
           }
           return b;                                            //return bytes
    }

1
Это декодирует шестнадцатеричный байтовый массив. Нечто очень отличающееся от того, о чем этот вопрос.
Палек
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.