2015-05-21 9 views
0

Во время выполнения я получаю данные байтового буфера с устройства, пытаюсь декодировать эти данные, чтобы прочитать их содержимое.Преобразование bytebuffer в строку, не работающую в java

Когда я распечатать ByteBuffer, используя строку он показывает, как следует,

java.nio.HeapByteBuffer[pos=0 lim=3 cap=3] 

Я попытался расшифровать, используя все известные форматы, как следует,

 CharBuffer charBuffer = StandardCharsets.UTF_8.decode(paramByteBuffer); 
     String text = charBuffer.toString(); 
     System.out.println("UTF-8"+text); 
     charBuffer = StandardCharsets.UTF_16.decode(paramByteBuffer); 
     text = charBuffer.toString(); 
     System.out.println("UTF_16"+text); 
     charBuffer = StandardCharsets.ISO_8859_1.decode(paramByteBuffer); 
     text = charBuffer.toString(); 
     System.out.println("ISO_8859_1"+text); 
     charBuffer = StandardCharsets.UTF_16BE.decode(paramByteBuffer); 
     text = charBuffer.toString(); 
     System.out.println("UTF_16BE"+text); 
     charBuffer = StandardCharsets.UTF_16LE.decode(paramByteBuffer); 
     text = charBuffer.toString(); 
     System.out.println("UTF_16LE"+text); 
     charBuffer = StandardCharsets.US_ASCII.decode(paramByteBuffer); 
     text = charBuffer.toString(); 
     System.out.println("US_ASCII"+text); 

Все возвращает пустые данные.

Каковы способы декодирования данных байтового буфера?

+0

Что такое 'paramByteBuffer'? И что в нем? –

+0

Его байтовые данные буфера, но не уверены в формате. – Harry

ответ

1

Вы можете сделать что-то вроде этого:

String val = new String(paramByteBuffer.array()); 

ИЛИ

String val = new String(paramByteBuffer.array(),"UTF-8"); 

Here список поддерживаемых кодировок

1

toString метод HeapByteBuffer просто

Возвращает строку, суммирующую состояние этого буфера.

Другими словами, она возвращает

java.nio.HeapByteBuffer[pos=0 lim=3 cap=3] 

, который показывает положение, предел, и емкость байта буфера.

В этом случае ваш ByteBuffer может разместить еще 3 байта. Каждый звонок Charset#decode потребляет ByteBuffer, а вы не rewind/reset, поэтому для последующих вызовов больше нет байтов. Другими словами, все эти строки будут пустыми.

2

Буферы немного сложны в использовании, так как они имеют текущее состояние, которое необходимо учитывать при доступе к ним.

вы хотите поставить

paramByteBuffer.flip(); 

перед каждым декодированием, чтобы получить буфер в состояние требуется для декодирования для чтения.

например.

ByteBuffer paramByteBuffer = ByteBuffer.allocate(100); 
paramByteBuffer.put((byte)'a'); // write 'a' at next position(0) 
paramByteBuffer.put((byte)'b'); // write 'b' at next position(1) 
paramByteBuffer.put((byte)'c'); // write 'c' at next position(2) 

// if I try to read now I will read the next byte position(3) which is empty 
// so I need to flip the buffer so the next position is at the start 
paramByteBuffer.flip();   

// we are at position 0 so we can do our read function 
CharBuffer charBuffer = StandardCharsets.UTF_8.decode(paramByteBuffer); 
String text = charBuffer.toString(); 
System.out.println("UTF-8" + text); 

// because the decoder has read all the written bytes we are back to the 
// state (position 3) we had just after we wrote the bytes in the first 
// place so we need to flip again 
paramByteBuffer.flip(); 

// we are now at position 0 so we can do our read function 
charBuffer = StandardCharsets.UTF_16.decode(paramByteBuffer); 
text = charBuffer.toString(); 
System.out.println("UTF_16"+text); 
+0

Тем не менее, его возвращение только некоторые символ нежелательной. – Harry

+0

Вы должны этого ожидать. Различные символы имеют разные значения для каждого символа. – BevynQ

+0

, так как его расшифровать и получить данные? – Harry