Это правильный подход для преобразования ByteBuffer в String таким образом,
String k = "abcd";
ByteBuffer b = ByteBuffer.wrap(k.getBytes());
String v = new String(b.array());
if(k.equals(v))
System.out.println("it worked");
else
System.out.println("did not work");
Причина, по которой я спрашиваю, заключается в том, что это выглядит слишком просто, тогда как другие подходы, такие как Java: преобразование String в ByteBuffer и из него, и связанные с этим проблемы выглядят более сложными.
java
string
serialization
bytearray
vikky.rk
источник
источник
Ответы:
РЕДАКТИРОВАТЬ (2018): отредактированный ответ брата от @xinyongCheng - более простой подход, и он должен быть принятым ответом.
Ваш подход был бы разумным, если бы вы знали, что байты находятся в кодировке платформы по умолчанию. В вашем примере это правда, потому что
k.getBytes()
возвращает байты в кодировке платформы по умолчанию.Чаще вы захотите указать кодировку. Однако есть более простой способ сделать это, чем заданный вами вопрос. String API предоставляет методы, которые преобразуют массив String в массив byte [] в определенной кодировке. Эти методы предлагают использовать CharsetEncoder / CharsetDecoder, «когда требуется больший контроль над процессом декодирования [кодирования]».
Чтобы получить байты из String в определенной кодировке, вы можете использовать родственный метод getBytes ():
Чтобы поместить байты с определенной кодировкой в String, вы можете использовать другой конструктор String:
Обратите внимание, что
ByteBuffer.array()
это необязательная операция. Если вы создали свой ByteBuffer с массивом, вы можете использовать этот массив напрямую. В противном случае, если вы хотите быть в безопасности, используйтеByteBuffer.get(byte[] dst, int offset, int length)
для получения байтов из буфера в массив байтов.источник
ByteBuffer.get
функции ввод снова представляет собой массив байтов, как мне его получить? нет смысла повторять k.getbytes, не так ли?ByteBuffer.get(byte[] dst, int offset, int length)
. Вы можете построить из него String с помощью конструктора String () `String (byte [] bytes, int offset, int length, Charset charset). Вы можете использовать одинаковые значения смещения и длины для обоих вызовов.k
это String, а не ByteBuffer.Энди Томас упомянул более простой способ без проблем декодировать a
ByteBuffer
в aString
.источник
CharBuffer
decode()
возвращается этоCharSequence
(какString
), так что вы можете избежать дополнительную копию и использовать его непосредственно.Попробуй это:
NB. вы не можете правильно преобразовать байтовый массив в String, не зная его кодировки.
надеюсь, это поможет
источник
.array()
может возникнуть исключение..array()
метод.array()
, вы также должны использовать,arrayOffset()
чтобы начать с правильной позиции в массиве! Это небольшая ловушка, потому что обычно arrayOffset () имеет значение 0; но в тех редких случаях, когда это не так, вы столкнетесь с труднодоступными ошибками, если не примете их во внимание.Просто хотел отметить, что предполагать, что ByteBuffer.array () всегда будет работать, небезопасно.
Обычно buffer.hasArray () всегда будет иметь значение true или false в зависимости от вашего варианта использования. На практике, если вы действительно не хотите, чтобы он работал ни при каких обстоятельствах, можно безопасно оптимизировать ветку, которая вам не нужна. Но остальные ответы могут не работать с ByteBuffer, созданным с помощью ByteBuffer.allocateDirect ().
источник
ByteBuffer.wrap(bytes, offset, size)
factory,.array()
будет возвращен весьbytes
массив. Лучше используйте форму, которую предложил Синьюн Ченгarray()
, вы также должны использовать,arrayOffset()
чтобы начать с правильной позиции в массиве! Это небольшая ловушка, потому что обычно arrayOffset () имеет значение 0; но в тех редких случаях, когда это не так, вы столкнетесь с труднодоступными ошибками, если не примете их во внимание.Ответы, относящиеся к простому вызову
array()
, не совсем верны: когда буфер был частично использован или относится к части массива (вы можетеByteBuffer.wrap
массив с заданным смещением, не обязательно с самого начала), мы должны учитывать это в наших расчетах. Это общее решение, которое работает для буферов во всех случаях (не распространяется на кодировку):О проблемах, связанных с кодированием, см. Ответ Энди Томаса.
источник
Корень этого вопроса в том, как декодировать байты в строку?
это можно сделать с помощью JAVA NIO CharSet:
public final CharBuffer decode(ByteBuffer bb)
источник
Обратите внимание (помимо проблемы с кодировкой), что для некоторых из более сложных связанных кодов возникают проблемы с получением «активной» части рассматриваемого ByteBuffer (например, с помощью позиции и ограничения), а не просто кодирования всех байтов. во всем массиве поддержки (как и во многих примерах в этих ответах).
источник
Преобразуйте String в ByteBuffer, затем из ByteBuffer обратно в String с помощью Java:
Что сначала печатает напечатанную пустую строку, а затем ByteBuffer, преобразованный в array ():
Также это было полезно для меня, сокращение строки до примитивных байтов может помочь понять, что происходит:
Печатает вашу строку, интерпретируемую как UTF-8, а затем снова как ISO-8859-1:
источник
источник
Вот простая функция для преобразования байтового буфера в строку:
источник