2016-07-09 12 views
0

Guten Morgen. Ich muss Daten mit dem folgenden Format in einem ByteBuffer speichern. Dieser ByteBuffer wird dann gespeichert und später auf die Konsole gedruckt.Schreiben eines gemischten Datentyps in einen ByteBuffer

Datenformat:

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

Die Speicher Teil sieht einfach.

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()); 

Ich kann das zugrunde liegende Byte-Array abrufen, indem Sie:

byte[] bArray = buff.array(); 

Wie kodieren ich die bArray in einer Reihe, so dass es auf die ursprüngliche Zeichenfolge (nach Wert-Gleichheit) gleich ist?

Vielen Dank

+0

Sie scheinen auf dem richtigen Weg zu sein, also was genau funktioniert nicht? – Silverclaw

+1

Bitte beachten Sie, dass 'buffer.putInt (10)' nicht den String "10" erzeugt. Es erzeugt vier Bytes, die die Ganzzahl 10 enthalten, die als Big-Endian-Nummer codiert ist! Ihr Code sieht so aus, als würden Sie alle Ihre Daten als String codieren, was nicht der Zweck eines ByteBuffers ist. Wenn Sie einen String erstellen möchten, verwenden Sie stattdessen einen 'StringWriter'. – Robert

Antwort

1

Hier ist, wie Sie es tun können. Beachten Sie, dass es gut funktioniert, weil der String das Letzte ist, was Sie geschrieben haben, also wissen Sie, dass es vom nach dem letzten geschriebenen Zeichen an die letzte geschriebene Position des Puffers geht. Wenn es in der Mitte war, müssten Sie irgendwie die Länge der Zeichenfolge schreiben, um wissen zu können, wie viele Bytes gelesen werden müssen.

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

Danke für den Vorschlag und das Codebeispiel JB. Ich schrieb die Größe des Feldes vor dem Schreiben der eigentlichen Daten und es funktioniert gut. – CaptainHastings

Verwandte Themen