Як перетворити рядок Java в байт []?


538

Чи є якийсь спосіб перетворити 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());

і я отримую окремі результати. Не вдається відобразити перший вихід, оскільки це 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());
}


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

8
Ваша проблема полягає в тому, String.getBytes()що дійсно повертає байтовий масив, але ваше переконання, що toString()байтовий масив поверне корисний результат, неправильне.
Луї Вассерман

Відповіді:


948

Об'єкт, який 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"))
Bahadır Yağan

3
Я вважаю, що StandardCharsetsце нове для Java 7
Стюарт

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

3
@LarsH Ви добре зазначаєте. Якщо чесно, я ніколи не очікував, що ця відповідь стане такою популярною. Зараз я розширив відповідь, щоб "заслужити" репутацію. Сподіваємось, це покращення.
Стюарт


14

Спробуйте використовувати String.getBytes (). Він повертає байт [], що представляє рядкові дані. Приклад:

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

14

Просто:

String abc="abcdefghight";

byte[] b = abc.getBytes();

Що робити, якщо не abcмістяться символи US-ASCII, як-от "greater than 2³² − 1"або просто двійкові дані (наприклад, " A bb")?
U. Windl

це не працює для символів, як цей рядок містить лише 5 символів. Однак коли я використовую, getBytes()я отримав 7 символів.
Теоччі

11

Ви можете використовувати, String.getBytes()який повертає byte[]масив.



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.