Как преобразовать представленный String ByteBuffer в байтовый массив в Java

2

Я новичок в Java, и я не уверен, как сделать следующее:

Приложение Scala где-то преобразует строку в байты:

ByteBuffer.wrap(str.getBytes)

Я собираю этот массив байтов как String Java, и я хочу сделать обратное тому, что сделал выше код Scala, следовательно, получить исходную строку (объект str выше).

Получение ByteBuffer как String для начала является единственным вариантом, который у меня есть, поскольку я читаю его из потока AWS Kinesis (или это?). Код Scala также не должен изменяться.

Пример строки:

String str = "AAAAAAAAAAGZ7dFR0XmV23BRuufU+eCekJe6TGGUBBu5WSLIse4ERy9............";

Как это можно достичь в Java?

РЕДАКТИРОВАТЬ

Хорошо, поэтому я попытаюсь подробнее рассказать о процессе:

  1. Стороннее приложение Scala создает строки CSV, которые мне нужно потреблять
  2. Перед сохранением этих строк в потоке AWS Kinesis приложение выполняет следующие строки для каждой строки:

    ByteBuffer.wrap(output.getBytes);
    
  3. Я прочитал данные из потока в виде строки, и строка могла выглядеть следующим образом:

    String str = "AAAAAAAAAAGZ7dFR0XmV23BRuufU+eCekJe6TGGUBBu5WSLIse4ERy9............";
    
  4. Мне нужно восстановить содержимое строки выше в ее исходную, читаемую форму;

Надеюсь, теперь я поняла, что извиняюсь за то, что вы все начинаете с удивления.

  • 0
    Разве что-то вроде str.toCharArray.map(_.toByte) работать в Java?
  • 0
    Возможно, но я не уверен, что понимаю, что вы там делали с частью map(_.toByte)
Показать ещё 3 комментария
Теги:

5 ответов

2
Лучший ответ

Если вы хотите перейти от byte[] в String, попробуйте new String(yourBytes).

Оба getBytes и String(byte[]) используют кодировку по умолчанию.


Из справочника Amazon Kinesis Service API:

Данные blob помещаются в запись, которая кодируется Base64 при сериализации блока.

Вам нужно base64 декодировать строку. Используя Java 8, он будет выглядеть так:

byte[] bytes = Base64.getDecoder().decode("AAAAAAAAAAGZ7dFR0XmV23BR........");
str = new String(bytes, "utf-8"));

Другие варианты: кодировка Base64 в Java

  • 0
    Я на самом деле пробовал это, это могло бы быть проще, если бы мой ввод не был строкой в байтах (см. Выше) То, что вы предлагаете, просто обрабатывает строку так, как если бы она была содержимым в удобочитаемой форме.
  • 0
    Не могли бы вы уточнить. Я думал, что вы в основном хотели обратное getBytes?
Показать ещё 8 комментариев
1

Я не уверен, насколько я точно понимаю вопрос, но вы имеете в виду это?

String decoded = new String(bytes);
0

Для данных Kinesis:

private CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
decoder.decode(record.getData()).toString();
0

Извините, неверный ответ. Опять же, ByteBuffer - это класс java. Так они могут работать одинаково. Вам нужна версия Java.

От kafka ApiUtils:

def writeShortString(buffer:ByteBuffer,string:String){
   if(String == null){
       buffer.putShort(-1)
   }
   else{
     val encodedString = string.getBytes("utf-8")
     if(encodedString.length > Short.MaxValue){
         throw YourException(Your Message)
     else{
        buffer.putShort(encodedString.length.asInstanceOf[Short])
        buffer.put(encodedString)
   }
  }

}

0
public static void main(String[] args){
    String decoded = new String(bytesData);
    String actualString;
    try{
       actualString = new String(bytesData,"UTF-8");
       System.out.printLn("String is" + actualString);
    }catch(UnsupportedEncodingException e){
       e.printstacktrace();
    }
}
  • 0
    То, что вы предлагаете, просто обрабатывает строку так, как если бы она была содержимым в удобочитаемой форме. Исходная строка выглядит следующим образом: String str = "AAAAAAAAAAGZ7dFR0XmV23BR........"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню