RandomAccessFile

Status
Nicht offen für weitere Antworten.
M

martin

Gast
Hallo erstmal,

ich wollte eine *.bmp auslesen

unter c hab ich das so gemacht:
Code:
...
    int Breite, Hoehe;
    fseek(Bild,0x12,SEEK_SET);
    fread(&Breite,4,1,Bild);
    fread(&Hoehe,4,1,Bild);...

in java dacht ich das dass so geht:
Code:
File file = null;
    int biWidth, biHeight;
    int offset_Datenbereich;
    try {
        RandomAccessFile raFile = new RandomAccessFile(filename, "r");
        raFile.seek(0x12);
        biWidth = raFile.readInt();
        biHeight = raFile.readInt();
        raFile.close();
    } catch(FileNotFoundException e) {
        System.out.println("Fehler: Datei nich gefunden");
    }

nur unter Java kommen bei die falschen Werte. Anstatt 640 bzw. 480 unter c (die sind richtig, denn das Bild is 640x480) kommen da -2147352576 und -536805376.
kann mir einer nen tipp geben?
 
Das ist sicherlich "big vs small endian" Problem. Ich habe das überprüft.
Code:
-2147352576 = 0x80020000;
640=0x00000280;
 
M

martin

Gast
und wie löse ich das, fals es das ist?
ich will doch nur ab einer bestimmten stelle in einer Datei eine 4byte (also integer) Zahl auslesen, und ab und zu mal ne 2byte(short).
 
martin hat gesagt.:
und wie löse ich das, fals es das ist?
ich will doch nur ab einer bestimmten stelle in einer Datei eine 4byte (also integer) Zahl auslesen, und ab und zu mal ne 2byte(short).
Code:
int readIntLittleEndian( ){
            // 4 bytes
            int accum = 0;
            for ( int shiftBy = 0; shiftBy < 32; shiftBy+ =8 ){
                  accum |= (readByte () & 0xff) << shiftBy;
            } 
            return accum;
} 
short readShortLittleEndian( ){
            // 2 bytes
            int low = readByte() & 0xff;
            int high = readByte();
            // avoid masking here
            return (short )(high << 8 | low);
}
Geht das?
 
G

Guest

Gast
wow,
zumindest
Code:
int readIntLittleEndian( )
funktioniert schonmal (weil bisher nur das getestet)
aber geht das denn nicht einfacher?

danke danke desert pinguin :)
 
M

martin

Gast
und
Code:
short readShortLittleEndian()
auch
danke nochmal
hier so wie ich es nutze
Code:
	/**
	 * liest Integer aus einer Datei im Little-Endian-Format 
	 * @param raFile
	 * @return
	 */
	int readIntLittleEndian(RandomAccessFile raFile){
		int accum = 0; 
		try { 	// 4 bytes 
			for ( int shiftBy = 0; shiftBy < 32; shiftBy += 8 ){ 
				  accum |= (raFile.readByte() & 0xff) << shiftBy; 
			}
		} catch (IOException e) {} 
		return accum; 
	}
	/**
	 * liest Short aus einer Datei im Little-Endian-Format
	 * @param raFile
	 * @return
	 */ 
	short readShortLittleEndian(RandomAccessFile raFile){ 
		int low = 0;
		int high = 0;
		try {	// 2 bytes 
			low = raFile.readByte() & 0xff; 
			high = raFile.readByte(); 
			// avoid masking here
		} catch (IOException e) {} 
		return (short )(high << 8 | low); 
	}
 
Da Ich auch das Problem hatte, wurden die Methoden von mir gegooglet:)
Nur möchte Ich auf Folgendes hinweisen.
Code:
      } catch (IOException e) {}
Auf keinen Fall kann man die Ausnahmen ignorieren.
 

marsias

Aktives Mitglied
Hi!

Also ich würde so an die sache gehen...
- Wie ist eine bitmap überhaupt aufgebaut? (spezifikation)
- ein testbild dessen werte man weiß


wenn man das doch hat kann man das hinprogrammieren
und testen ob es funktioniert.

wenn bmp sagt die werte werden in bigendian gespeichert
dann sollte man die auch so auslesen.

Jedes Format hat ja seine Regeln.

Musste es mal für Tiff machen. Auslesen und so.
in der Spec stand wo was in der datei geschrieben stannd.
ob es als big oder little endian kodiert ist usw....

mfg
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben