Bytes aus Datei lesen

Zilchinger

Mitglied
Hallo,
ich habe folgendes Problem:

Ich habe eine Binärdatei, aus der ich Daten auslesen will.
Das Ding ist wie folgt aufgebaut:
Jeder Datensatz in der Datei kann wie ein spezieller Record behandelt werden.
Dabei sind die ersten 4 Bytes der Name des Records die nächsten 4 Bytes sind die Länge des Inhaltes. Um nun den nächsten Record zu finden addiert man 8 Byte + die Länge des Inhaltes auf.

Hierbei arbeite ich mit einem RandomAccessFile.

Jetzt mein Problem:
Ich habe versucht mit der Methode readInt() vom RandomAccessFile, die ersten vier Byte einzulesen, das geht aber irgendwie nicht, da kommen Werte raus, die Überhaupt nicht passen.
Dann habe ich die 4 Byte in ein byte[] eingelesen und mir die einzelnen Inhalte angeschaut. Da steht dan sowas drin: {62,1,0,0}
Rauskommen soll aber 318 (dezimal).

Kann mir hierbei jemand helfen? Muß ich da irgendwie mit Hexwerten arbeiten?
Ich hab leider keine Ahnung :confused:
 
Ist die Datei schon vorgegeben und du weißt wie die Daten darin abgespeichert sind, oder hast du das abgespeichert?
Wenn du das abgespeichert hast zeig mal bitte wie du das in die Datei schreibst.

Poste am besten mal deinen Quelltest fürs Auslesen und evtl. fürs Schreiben.
 
Die Datei ist leider vorgegeben,
Also ich habe noch herausgefunden, das die ersten vier Byte, die ich aus dem Record auslesen will ein Hexwert ist. Die zweiten vier Byte auch.

D.h. ich bin jetzt so weit das ich jedes Byte in ein Array einlesen kann. Nur ich komme dann nicht zum Hexwert. Lieber wäre mir noch der Integerwert von dem Hexwert.

Um das Array zu füllen nehme ich die Methode readUnsignedByte(), weil es sonst teilweise zu negativen Werten kommt.

hier ein Beispiel: 155(dezimal) soll rauskommen:
mit der methode read(byte[]) kommt raus: {-101,0,0,0}
mit der Metode readUnsignedByte() kommt raus: {155,0,0,0}

Bis hier hin stimmt auch alles, aber wenn die Werte größer werden wie 256
dann geht das nicht mehr.

bei 261(dezimal) steht dann im Array {5,1,0,0}
Wie bekomme ich da jetzt den Integerwert oder den Hexwert raus? :confused:
 
Hallo!

also ich weis nicht was du hast:
Code:
/*
 * Created on 09.03.2005@20:53:36
 *
 * TODO Explain me...
 */
package de.tutorials;

/**
 * @author Darimont
 * 
 */
public class ByteExample {

	public static void main(String[] args) {
		byte[] b = { 62, 1, 0, 0 };
		int val = 0;
		for (int i = 0; i < b.length; i++) {
			val |= b[i] << 8 * i;
		}
		System.out.println(val);
	}
}

Gibt doch 318 aus ;-)

HTH,

Gruß Tom
 
Hallo Thomas,
ich bin verblüfft ;)

Kannst du mir noch eben schnell erklären, was die Zeile macht:
Code:
val |= b[i] << 8 * i;

Ich programmiere ungern mit Sachen, die ich nicht so richtig verstehe :)

Ich bedanke mich für die Antwort, echt prima
 
Hallo!

Ein int unter java ist 4 bytes groß. -> 11111111 22222222 33333333 44444444

D.h wenn wir ein einen int Wert byteweise aus einer Datei auslesen wollen müssen wir die bytes wieder zu einem int zusammen setzen.
Wir lesen also zuerst das 1 erste byte aus, dann das 2.te, 3.te etc.

Um daraus nun wieder ein int zu machen müssen wir die enzelnen bytes natürlich wieder an ihre "richtige" stelle in der byte Darstellung des int's rücken.

Das machen wir mittels des << n Operators. Dieser schiebt die voranstehenden bytes um n Stellen nach links. Mit der | (or) Verknüpfung "sammeln" wir nun wieder alle bytes in der Variablen val auf und legen sie "richtig" positioniert Zusammen.

Btw. Am Rande sei hier mal erwähnt, dass man mittels x << n eine "schnelle" Multiplikation
( x * 2 ^ n) und mittels x >> n eine "schnelle" Division (x/2^n) erzeugen kann.

Code:
/**
 * 
 */
package de.tutorials;

/**
 * @author Administrator
 *
 */
public class ShiftMulDivExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int i = 10;
		System.out.println(i << 2); // 40 
		System.out.println(i >> 1); // 5
	}

}

Gruß Tom
 
Hallo Tom,
danke für die Erklärung hab noch ein bischen rumgespielt, und auch verstanden.

Ja ja irgendwann im Grundstudium, gabs mal ein Fach Rechnerarchitektur, da war das wohl mal dran.... ;)
 
Zurück