2016-07-09 5 views
0

Доброе утро. Мне нужно сохранить данные в следующем формате в ByteBuffer. Этот ByteBuffer затем сохраняется и затем печатается на консоль.Написание смешанного типа данных в ByteBuffer

Формат данных:

10:30    [2]     This is my message to you. 
IntCharInt Char CharIntChar Char String 

Запоминание часть выглядит просто.

ByteBuffer buff = ByteBuffer.allocate(100); 

buffer.putInt(10).putChar(':').putInt(30).putChar(' '); 
buffer.putChar('[').putInt(2).putChar(']').putChar(' '); 
buffer.put("This is my message to you.".getBytes()); 

я могу получить основной массив байтов, выполнив:

byte[] bArray = buff.array(); 

Как кодировать Баррэ в строку таким образом, что она равна исходной строке (по ценностного равенства)?

Много спасибо

+0

Вы, кажется, находитесь на правильном пути, так что конкретно не работает? – Silverclaw

+1

Обратите внимание: 'buffer.putInt (10)' не создает строку «10». Он создает четыре байта, содержащих целое число 10, закодированное как большое число endian! Ваш код выглядит так, будто вы хотите кодировать все свои данные как String, что не является целью ByteBuffer. Если вы хотите создать строку, используйте вместо нее 'StringWriter'. – Robert

ответ

1

Вот как вы можете это сделать. Обратите внимание, что он отлично работает, потому что String - это последнее, что вы написали, поэтому вы знаете, что это происходит от последнего записанного символа до последней записанной позиции буфера. Если бы это было посередине, вам нужно как-то написать длину строки, чтобы узнать, сколько байтов читать.

ByteBuffer buffer = ByteBuffer.allocate(100); 

    buffer.putInt(10).putChar(':').putInt(30).putChar(' '); 
    buffer.putChar('[').putInt(2).putChar(']').putChar(' '); 

    // use a well-defined charset rather than the default one, 
    // which varies from platform to platform 
    buffer.put("This is my message to you.".getBytes(StandardCharsets.UTF_8)); 

    // go back to the beginning of the buffer 
    buffer.flip(); 

    // get all the bytes that have actually been written to the buffer 
    byte[] bArray = new byte[buffer.remaining()]; 
    buffer.get(bArray); 

    // recreate a buffer wrapping the saved byte array 
    buffer = ByteBuffer.wrap(bArray); 
    String original = 
     new StringBuilder() 
      .append(buffer.getInt()) 
      .append(buffer.getChar()) 
      .append(buffer.getInt()) 
      .append(buffer.getChar()) 
      .append(buffer.getChar()) 
      .append(buffer.getInt()) 
      .append(buffer.getChar()) 
      .append(buffer.getChar()) 
      .append(new String(buffer.array(), buffer.position(), buffer.remaining(), StandardCharsets.UTF_8)) 
      .toString(); 
    System.out.println("original = " + original); 
+0

Спасибо за предложение и образец кода JB. В конце концов я написал размер поля, прежде чем писать фактические данные, и он работает отлично. – CaptainHastings