In Buffer schreiben, aber an verschiedenen Stellen?

MixHeadroom

Grünschnabel
Hallo,

ich habe ein kleine (Anfänger-)Problem, bei dem ich einfach nicht so recht den Anfang finde:

Ich muss verschiedene Daten (Zahlen) in eine Art Buffer (bitte keine .txt Dateien oder ähnliches, sondern ein temporärer Buffer) schreiben, und zwar an verschiedenen Stellen. Also der Buffer soll z.b. so aufgebaut sein:

Color [16 Bits]
x-coordinate [32 bits]
y-coordinate [32 bits]
time [16 Bits]

Die werte in den Klammern sind die Speicherzellen, die dafür reserviert sind. (für die Farbe ist also ein 16-bit wert vorgesehen).

Jetzt bekomme ich die Werte leider nicht in dieser Reihenfolge, ich muss also den Buffer bitweise ansprechen können. Ich bekomme also zuerst den TIME-Wert und muss ihn an die 4.Stelle plazieren. Dann bekomme ich die Koordinaten, die an die 2. und 3. Stelle plaziert werden müssen. Dabei darf natürlich nicht das Grössengefüge zerstört werden (also für die x-koordinate MUSS 32 bit reserviert sein, egal wie gross die Koordinate tatsächlich ist).

Kann mir da vielleicht einer helfen? Die Werte bekomme ich, ist keine Problem, ich komme irgendwie nur auf keinen grünen Zweig mit dem Aufbau und dem Beschreiben des Buffers.

Vielen Dank für eure Hilfe. :)

Mix
 
Ich versteh nicht ganz was du meinst?

Du willst die Daten binär speichern?

Ein Speicherobject erstellen, per ObjectOutputstream diesen Speichern.
Ander Möglichkeit, aber weniger ratsam währe ByteOutputStream zu nutzen.
 
ja, ich brauch das ganze praktisch binär gespeichert, um es per TCP Packet zu versenden. Der Empfänger erwartet das ganze auch in genau diesem Format
der Buffer sollte dann z.b. so aussehen:

36 0128 0116 06 -- (die leerzeichen dienen hier nur der übersichtlichkeit)

36 - color
0128 x-koordinate
0116 y-koordinate
06 time

Hoffe ich hab mir jetzt etwas klarer ausgedrückt, sorry.
 
Original geschrieben von MixHeadroom
ja, ich brauch das ganze praktisch binär gespeichert, um es per TCP Packet zu versenden. Der Empfänger erwartet das ganze auch in genau diesem Format
der Buffer sollte dann z.b. so aussehen:

36 0128 0116 06 -- (die leerzeichen dienen hier nur der übersichtlichkeit)

36 - color
0128 x-koordinate
0116 y-koordinate
06 time

Hoffe ich hab mir jetzt etwas klarer ausgedrückt, sorry.

In dem Fall schau dir den DataOutputStream aus.
Dieser kann primitive Datentypen binär speichern.

Falls du dennoch die möglichkeit hast, den Empfänger so zu ändern (ist es ebenfalls ein Javaprogramm?) das dieser ebenso ObjectInputStream nutzt dann solltest du das tun, da dies a) Einfacher, b) weniger Fehleranfällig, c) sicherer ist
 
Hi!

Weshalb nimmst du kein byte-Array?

Color [16 Bits]
x-coordinate [32 bits]
y-coordinate [32 bits]
time [16 Bits]

in deinem Fall:

Code:
byte[] myByteBuffer = new byte[12];
...

Dort könntest du dann später ganz locker die einzelnen Bit's der Bytes mittels
der Binaren Operatoren &, |, <<,>> wieder, so wie du sie brauchst zusammen schieben ...

Gruß Tom
 
Original geschrieben von Thomas Darimont
Hi!

Weshalb nimmst du kein byte-Array?


Gruß Tom

hmm, daran hab ich noch gar nicht gedacht .... !?:)

Was ist daran schlechter / besser als der "DataOutputStream" von Christian? Mit erscheint das byte array ein bisschen einfacher zu handlen. Kann auch daran liegen dass ich noch relativ am Anfang bin :)

Achja, die Gegenseite ist wohll C++, also kein Java Programm.
 
Moin!

Versuchs mal damit:

Code:
/*
 * Created on 19.02.2004
 *
 * To change the template for this generated file go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */

/**
 * @author Darimont
 *
 * To change the template for this generated type comment go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
public class MyByteWrapper {

	/* Ein long ist in java 8 byte groß -> 64 bit ...
	 * xy Buffer;
	 * 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
	 * XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX YYYYYYYY YYYYYYYY YYYYYYYY YYYYYYYY
	 */
	private long xybuffer;

	/*Ein int ist in java 4 byte groß -> 32 bit
	 *color time buffer
	 * 
	 * 00000000 00000000 00000000 00000000
	 * CCCCCCCC CCCCCCCC TTTTTTTT TTTTTTTT
	 */

	private int ctbuffer;

	public static void main(String[] args) {
		MyByteWrapper mbw = new MyByteWrapper();
		mbw.setCtbuffer(65536 + 5);
		System.out.println(mbw.getTime());
		//System.out.println(Long.toBinaryString(mbw.getCtbuffer()));
		//mbw.setTime((short) 150);
		//System.out.println(Long.toBinaryString(mbw.getCtbuffer()));
		//System.out.println(mbw.getTime());
		System.out.println(mbw.getColor());

		mbw.setXYBuffer(4294967296l + 7l);
		
		System.out.println(mbw.getX());
		System.out.println(mbw.getY());

	}

	public short getTime() {
		return (short) (ctbuffer & 0xFFFF);
	}

	//short hat in java 2 byte
	public void setTime(short time) {
		short colorTmp = getColor();
		ctbuffer &= 0x0;
		ctbuffer |= time;
		ctbuffer |= (colorTmp << 16);
	}

	public void setColor(short color) {
		//ctbuffer 
		short timeTmp = getTime();
		ctbuffer &= 0x0;
		ctbuffer |= (color << 16);
		ctbuffer |= timeTmp;

	}

	public short getColor() {
		return (short) (ctbuffer >> 16);
	}

	public int getX() {
		return (int) (xybuffer >> 32);
	}

	public void setX(int x) {
		long yTmp = (long) getY();
		xybuffer |= 0x0;
		xybuffer |= (((long) x) << 32);
		xybuffer |= yTmp;
	}

	public int getY() {
		return (int) (xybuffer & 0xFFFF);
	}

	public void setY(int y) {
		long xTmp = (long) getX();
		xybuffer |= 0x0;
		xybuffer |= ((long) y);
		xybuffer |= (xTmp << 32);
	}

	/**
	 * @return
	 */
	public long getXYBuffer() {
		return xybuffer;
	}

	/**
	 * @param l
	 */
	public void setXYBuffer(long l) {
		xybuffer = l;
	}

	/**
	 * @return
	 */
	public int getCtbuffer() {
		return ctbuffer;
	}

	/**
	 * @param i
	 */
	public void setCtbuffer(int i) {
		ctbuffer = i;
	}

}

Gruß Tom
 

Neue Beiträge

Zurück