Hallo,
aus reinem Interesse an der Sache versuche ich ein vor vielen vielen Jahren von mir in C++ geschriebenes Schachprogramm nach Java zu übersetzen. Ich bin damit schon relativ weit gekommen, hänge jetzt aber an der Eröffnungsbibliothek.
Diese umfasst knapp 30.000 Züge und muss aus einer Datei eingelesen werden. Jedes Byte dieser Datei enthält in den ersten sechs Bits eine Zugnummer, über die der Zug festgestellt werden kann. Die beiden anderen Bits stehen für vier Attribute, über die Folgezüge und Varianten angezeigt werden.
In C++ werden die Bytes als Char-Typen eingelesen und auch behandelt. Da in Java der Typ Char 16 Bit hat, lese ich die Datei als Bytes ein. So lange für die Feststellung eines Zuges das Bit 7 keine Bedeutung hat, funktioniert alles. Das ändert sich mit dem letzten Byte einer Variante. Dieser Zustand wird durch das gesetzte Bit 7 angezeigt. Wenn aber das Bit 7 gesetzt ist, wird der gesamte Wert des Bytes als negativer Wert interpretiert, was naturgemäß zu einem falschen Ergebnis führen muss.
Ich könnte nun zwar die gesamte Datei mit der Eröffnungsbibliothek so speichern, dass jedes Byte als Short gespeichert und in Zukunft die Auswertung über diese Short-oder Char-Daten vorgenommen wird. Dies möchte ich aber nur als allerletzte Möglichkeit in Erwägung ziehen. Meine Versuche, die Byte-Daten per Casting nach Char doch als unsigned Werte zu behandeln, waren leider nicht erfolgreich.
Hat jemand eine Idee, wie ich dieses verflixte Bit 7 abfragen kann, ohne dass sich auch der übrige Wert ändert?
Hier der Code, mit dem ich die Eröffnungsbibliothek einlese:
Und hier noch ein Beispiel für die Auswertung:
Schon im Voraus ein Danke für jede Idee, die mir hilft, meine EB auch unter Java in etwa so wie unter C++ verwenden zu können.
kodela
aus reinem Interesse an der Sache versuche ich ein vor vielen vielen Jahren von mir in C++ geschriebenes Schachprogramm nach Java zu übersetzen. Ich bin damit schon relativ weit gekommen, hänge jetzt aber an der Eröffnungsbibliothek.
Diese umfasst knapp 30.000 Züge und muss aus einer Datei eingelesen werden. Jedes Byte dieser Datei enthält in den ersten sechs Bits eine Zugnummer, über die der Zug festgestellt werden kann. Die beiden anderen Bits stehen für vier Attribute, über die Folgezüge und Varianten angezeigt werden.
In C++ werden die Bytes als Char-Typen eingelesen und auch behandelt. Da in Java der Typ Char 16 Bit hat, lese ich die Datei als Bytes ein. So lange für die Feststellung eines Zuges das Bit 7 keine Bedeutung hat, funktioniert alles. Das ändert sich mit dem letzten Byte einer Variante. Dieser Zustand wird durch das gesetzte Bit 7 angezeigt. Wenn aber das Bit 7 gesetzt ist, wird der gesamte Wert des Bytes als negativer Wert interpretiert, was naturgemäß zu einem falschen Ergebnis führen muss.
Ich könnte nun zwar die gesamte Datei mit der Eröffnungsbibliothek so speichern, dass jedes Byte als Short gespeichert und in Zukunft die Auswertung über diese Short-oder Char-Daten vorgenommen wird. Dies möchte ich aber nur als allerletzte Möglichkeit in Erwägung ziehen. Meine Versuche, die Byte-Daten per Casting nach Char doch als unsigned Werte zu behandeln, waren leider nicht erfolgreich.
Hat jemand eine Idee, wie ich dieses verflixte Bit 7 abfragen kann, ohne dass sich auch der übrige Wert ändert?
Hier der Code, mit dem ich die Eröffnungsbibliothek einlese:
Java:
// Einlesen der EB nach openings
try {
File f = new File(libPath + File.separator + iniDat);
long lenLib = f.length();
if (lenLib == 0) {
JOptionPane.showMessageDialog(null,
"[InfoText]");
return false;
}
oplibSize = (int)lenLib;
openings = new byte[oplibSize];
try (InputStream in = new FileInputStream(f)) {
in.read(openings);
}
} catch (IOException e) {
JOptionPane.showMessageDialog(null,
"[InfoText]");
return false;
}
Und hier noch ein Beispiel für die Auswertung:
Java:
while ((((int)openings[libNo] & 0x3F) != opCount) && // solange Zug nicht gefunden
((int)openings[libNo] < 0x80)) { // und Variante vorhanden
nextLibNo(false); // nächsten Variantenblock suchen
}
Schon im Voraus ein Danke für jede Idee, die mir hilft, meine EB auch unter Java in etwa so wie unter C++ verwenden zu können.
kodela