Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

13.01.2012, 18:27

Java binäre Datei einlesen

Abend,

ist es möglich Dateiheader wie in C++ einzulesen? Folgendes möchte ich tun:

C-/C++-Quelltext

1
2
3
// Cpp!

file.read(reinterpret_cast<char*>(&m_header), sizeof(tgaHeader)); // tgaHeader -> struct


in

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Java!

public class tgaHeader{
    public char idLength;
    public char colorMapType;
    public char imageTypeCode;
    public char colorMapSpec[];
    public char xOrigin;
    public char yOrigin;
    public char width;
    public char height;
    public char bpp;
    public char imageDesc;
    
    public tgaHeader(){
        colorMapSpec = new char[5];
    }
}


Ich möchte dazu möglichst nicht jede Komponente einzeln einlesen...
Gefunden hab ich dazu file.read(byte[], offset, length), ist das richtig und wie wende ich sie richtig an?

Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

13.01.2012, 19:11

Möglich ist es schon. Soweit ich weiß aber nicht so ohne größere Umwege. Javolution (http://javolution.org/) bietet z.B. eine Struct Implementierung an, die genau soetwas bietet (siehe http://javolution.org/target/site/apidoc…/io/Struct.html).

Ansonsten vielleicht der Weg über die Reflection API. Zur Laufzeit sich die Felder der Klasse holen und füllen. Ist nur die Frage ob dabei die Reihenfolge erhalten bleibt.

foreach

Frischling

Beiträge: 87

Beruf: Student

  • Private Nachricht senden

3

13.01.2012, 19:33

In java wirst du um das einzelen einlesen der Komponenten nicht herumkommen. Ich weiß zwar nicht ob du in deinem java Beispielcode char nur als Platzhalter verwendet hast, aber du solltest dir im klaren sein, dass ein char in java 16 bit groß ist und zum Speichern von Uicode-Zeichen gedacht ist (short ist auch 16 bit groß).
Zudem ist der von dir gezeigte C++ Code nicht sicher, da er Probleme wie Endianness und Padding seitens des Kompilers ignoriert.

Die IO-Problematik ist in Java über etliche Klassen der Standard-Bibliothek verstreut. Einen guten Einstieg bieten die offiziellenJava-Tutorials.

Wenn du aber einfach nur Bilder einlesen willst (was ich anhand deines Beispiels vermute) kannst du in Java einfacher vorgehen. Allerdings werden so weit ich weiß nur die Formate GIF, PNG, JPEG, BMP, und WBMP untersützt.

Java-Quelltext

1
2
3
4
5
6
7
BufferedImage image = null;
try {
    // Der Dateityp wird anhande der Datei-Endung erkannt
    img = ImageIO.read(new File("cool_sprite.png"));
} catch (IOException e) {
    System.err.println("Sprite konnte nicht geladen werden!");
}


@Tobiking
Reflections und Serialisierung sind hier der falsche Ansatz.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

13.01.2012, 19:53

Wieso ist Reflection hier ein falscher Ansatz? Es geht hier immerhin nicht darum, ob man liniear direkt in den Speicher einlesen kann, sondern nur um's Auslesen von Daten in eine festgelegte Datenstruktur. Da eigenet sich Reflection prima. Und verglichen mit der Performance einer Festplatte ist da sicherlich kein Geschwindigkeitsnachteil zu messen, falls das Deine Bedenken sind.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

foreach

Frischling

Beiträge: 87

Beruf: Student

  • Private Nachricht senden

5

13.01.2012, 20:00

Wenn er wirklich nur eine Instanzen einer Klasse persistent auf der Festplatte speichern will, um sie später wieder einzulesen, ist Serialisierung natürlich in Java der richtige Weg. Aber wenn er Bilddateien einlesen will, dann macht es doch eigentlich keinen Sinn mit Serealisierung zu arbeiten.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

13.01.2012, 21:14

Wenn es nur um den Header geht, wieso nicht? Die reinen Pixel-Daten sollte er natürlich nicht so auslesen, lässt sich ohnehin nicht vernünftig auf eine Datenstruktur mit fixer Größe mappen.
Der vernünftigste Weg wäre ohnehin die Verwendung einer Library, die dieses Format schon kann.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

14.01.2012, 12:18

Mir klingt das schon etwas zu kompliziert ^^ ich denke ich les die Daten einfach einzeln ein. Tut ja keinem weh.

Zitat

Der vernünftigste Weg wäre ohnehin die Verwendung einer Library, die dieses Format schon kann.


Vernünftig ist leider nur nicht lehrreich, wenn ich das schon 1000000x mal geschrieben hätte, ok, aber so hab ich gerade die Chance alles was ich in C++ geschrieben habe noch einmal zu wiederholen. Ich weiß gerne wie es funktioniert...

Wenn garnichts klappt, kann ich dann so wie von foreach beschrieben ein png laden und dies an OpenGL übergeben? Ich hab noch nicht genau geguckt wie die Funktion in Java das macht, unter C++ ist ja klar...

Schonmal danke, ich probiers also erstmal so wie beschrieben.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

8

14.01.2012, 13:27

Wenn garnichts klappt, kann ich dann so wie von foreach beschrieben ein png laden und dies an OpenGL übergeben? Ich hab noch nicht genau geguckt wie die Funktion in Java das macht, unter C++ ist ja klar...

Ja, auf http://lwjgl.org/wiki/index.php?title=Ex…s_TextureLoader ist ein Beispiel zu sehen wie das ginge.

Werbeanzeige