Hallo zusammen,
also erstmal:
ich hab die Lösung schon selbst gefunden. War ein banaler Fehler (s. unten).
Ich lass das trotzdem mal hier stehen, da ich mich selbst noch als ziemlichen Anfänger bezeichnen würde und evtl. jemand seinen Senf dazu abgeben möchte.
Ich habe folgendes Problem:
Ich möchte gerne, dass ein Programm eine binäre Datei erstellt und diese dann von einem anderen Programm ausgelesen werden kann.
Das Schreiben funktioniert eigentlich sehr gut, nur mit dem Lesen klappt es nicht so ganz.
Erstmal hier der Code von dem Programm, das die daten schreibt, damit man versteht, was ich überhaupt auslesen möchte. Es handelt sich hierbei allerdings nur um ein Besipielprogramm, das um einiges kürzer ist als das Original. Es geht mir ja hauptsächlich darum, dass ich verstehe was ich falsch mache und das dann auf das eigentliche Programm übertragen kann.
Bei dem Original-Programm werden die Strings mit Leerzeichen aufgefüllt, falls sie nicht die 'richtige' Anzahl an Stellen haben. Also string3z wird auf 3 Zeichen aufgefüllt, string10z auf 10 Zeichen, etc.
Ich erhalte dann von dem Programm eine Datei, die so aussieht (in einem HEX-Editor siehts schöner aus):
So, nun zum Einlesen:
Den eigentlichen Fehler hab ich gefunden.
War saublöd.
Bei ner Schleife statt '<=' ein '>=' gesetzt.
Und schon wurde die Schleife übersprungen und alle folgenden hatten natürlich falsche Werte die gelesen wurden. War natürlich auch gleich die erste Schleife, so dass ALLE Werte falsch waren.
Ich poste trotzdem mal den Code, evtl. gibt es ja was dran auszusetzen (und davon geh ich aus)
also erstmal:
ich hab die Lösung schon selbst gefunden. War ein banaler Fehler (s. unten).
Ich lass das trotzdem mal hier stehen, da ich mich selbst noch als ziemlichen Anfänger bezeichnen würde und evtl. jemand seinen Senf dazu abgeben möchte.
Ich habe folgendes Problem:
Ich möchte gerne, dass ein Programm eine binäre Datei erstellt und diese dann von einem anderen Programm ausgelesen werden kann.
Das Schreiben funktioniert eigentlich sehr gut, nur mit dem Lesen klappt es nicht so ganz.
Erstmal hier der Code von dem Programm, das die daten schreibt, damit man versteht, was ich überhaupt auslesen möchte. Es handelt sich hierbei allerdings nur um ein Besipielprogramm, das um einiges kürzer ist als das Original. Es geht mir ja hauptsächlich darum, dass ich verstehe was ich falsch mache und das dann auf das eigentliche Programm übertragen kann.
Java:
import java.io.*;
class BeispielWrite
{
public static void main ( String[] args ) throws IOException
{
/*
** Hier werden die Werte
** für die Variablen festegelegt
** die in die Datei geschrieben
** werden sollen
*/
String string3zA = "abc";
String string10zA = "abcdefghij";
String string10zB = "1234567890";
String string12zA = "abcdefghijkl";
boolean[] boolArray = { true,
false,
false,
true };
byte[] byteArray = { 51,
42,
3,
111};
short shortA = 12345,
shortB = 421;
// Andere Variablen
String leer = " ";
char[] stringChars = new char[12];
String fileName = "./files/test.bdt";
DataOutputStream dataOut = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream( fileName ) ) );
// string3zA wird in das Charakter-Array eingelesen
// und daraus werden die einzelnen Chars in die
// Datei geschrieben
for(int i=0; i <= (string3zA.length()-1); i++)
{
stringChars[i] = string3zA.charAt(i);
dataOut.writeChar(stringChars[i]);
}
//Das Selbe nun für die anderen Strings
for(int i=0; i <= (string10zA.length()-1); i++)
{
stringChars[i] = string10zA.charAt(i);
dataOut.writeChar(stringChars[i]);
}
for(int i=0; i <= (string10zB.length()-1); i++)
{
stringChars[i] = string10zB.charAt(i);
dataOut.writeChar(stringChars[i]);
}
for(int i=0; i <= (string12zA.length()-1); i++)
{
stringChars[i] = string12zA.charAt(i);
dataOut.writeChar(stringChars[i]);
}
// Jetzt wird das BoolArray in die Datei geschrieben
for(int i=0; i <= 3; i++)
{
dataOut.writeBoolean(boolArray[i]);
}
// Dann das Byte Array
for(int i=0; i <= 3; i++)
{
dataOut.writeByte(byteArray[i]);
}
// Zuletzt werden die Shorts geschrieben
dataOut.writeShort(shortA);
dataOut.writeShort(shortB);
dataOut.close();
}
}
Bei dem Original-Programm werden die Strings mit Leerzeichen aufgefüllt, falls sie nicht die 'richtige' Anzahl an Stellen haben. Also string3z wird auf 3 Zeichen aufgefüllt, string10z auf 10 Zeichen, etc.
Ich erhalte dann von dem Programm eine Datei, die so aussieht (in einem HEX-Editor siehts schöner aus):
Code:
006100620063006100620063006400650066006700680069006A0031003200330034003500360037003800390030006100620063006400650066006700680069006A006B006C01000001332A036F303901A5
So, nun zum Einlesen:
Den eigentlichen Fehler hab ich gefunden.
War saublöd.
Bei ner Schleife statt '<=' ein '>=' gesetzt.
Und schon wurde die Schleife übersprungen und alle folgenden hatten natürlich falsche Werte die gelesen wurden. War natürlich auch gleich die erste Schleife, so dass ALLE Werte falsch waren.
Ich poste trotzdem mal den Code, evtl. gibt es ja was dran auszusetzen (und davon geh ich aus)
Java:
import java.io.*;
class Daten
{
//Variablen die mit Daten gefüllt werden sollen
String string3zA;
String string10zA;
String string10zB;
String string12zA;
boolean[] boolArray;
byte[] byteArray;
short shortA;
short shortB;
//Andere Variablen
char[] readerChar;
short readerShort;
byte readerByte;
boolean readerBool;
File fileDaten = new File("");
public Daten()
{
string3zA = "";
string10zA = "";
string10zB = "";
string12zA = "";
readerChar = new char[12];
boolArray = new boolean[4];
byteArray = new byte[4];
shortA = (short)0;
shortB = (short)0;
}
public void loading(File f)
{
fileDaten = f;
//Für erneutes Laden erstmal alle Daten wieder auf 0 setzen
string3zA = "";
string10zA = "";
string10zB = "";
string12zA = "";
readerChar = new char[12];
boolArray = new boolean[4];
byteArray = new byte[4];
shortA = (short)0;
shortB = (short)0;
try
{
DataInputStream instr =
new DataInputStream(
new BufferedInputStream(
new FileInputStream( fileDaten ) ) );
//string3zA einlesen
for(int i = 0; i <=2; i++)
{
readerChar[i] = instr.readChar();
string3zA = string3zA.concat(String.valueOf(readerChar[i]));
}
// Für Testzwecke
//System.out.println(string3zA);
//string10zA einlesen
for(int i = 0; i <=9; i++)
{
readerChar[i] = instr.readChar();
string10zA = string10zA.concat(String.valueOf(readerChar[i]));
}
// Für Testzwecke
//System.out.println(string10zA);
//string10zB einlesen
for(int i = 0; i <=9; i++)
{
readerChar[i] = instr.readChar();
string10zB = string10zB.concat(String.valueOf(readerChar[i]));
}
// Für Testzwecke
//System.out.println(string10zB);
//string12zA einlesen
for(int i = 0; i <=11; i++)
{
readerChar[i] = instr.readChar();
string12zA = string12zA.concat(String.valueOf(readerChar[i]));
}
// Für Testzwecke
//System.out.println(string12zA);
for(int i=0; i <= 3; i++)
{
boolArray[i] = instr.readBoolean();
// Für Testzwecke
//System.out.println(String.valueOf(boolArray[i]));
}
for(int i=0; i <= 3; i++)
{
byteArray[i] = instr.readByte();
// Für Testzwecke
//System.out.println(String.valueOf(byteArray[i]));
}
shortA = instr.readShort();
shortB = instr.readShort();
// Für Testzwecke
//System.out.println(String.valueOf(shortA));
//System.out.println(String.valueOf(shortB));
instr.close();
}
catch ( IOException iox )
{
System.out.println("IO Problems with " + fileDaten );
}
}
}
public class BeispielRead
{
public static void main ( String[] args )
{
String filename = "./files/test.bdt";
File fileMain = new File(filename);
Daten daten1 = new Daten();
daten1.loading(fileMain);
}
}
Zuletzt bearbeitet: