Schlüsseldatei mit Umlauten parsen, aber wie.

  • Themenstarter Themenstarter tuxbanker
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
T

tuxbanker

Gast
Hallo Leute,

ich stehe vor folgendem Problem: Ich möchte eine Datei in einem exotischen, aber spezifizierten Format
parsen. Der Inhalt wirkt etwas kryptisch, was auch so richtig ist, weil die Datei zwar ein Klartextformat
ist, aber Schlüssel für eine gesicherte Kommunikation enthält.

...
uAåv™¿+}Ø5Ë[^M$?Ê}ƒ£p¨š÷Ï·DûzÍû³ŽÐW"‰ˆ ñ×#Be—ÄënÛj7ñŸüèfl@B
Q ~Ó·O.OmVÃæ¼?øy]füÝry˜ ázóÆžl÷?™
li4!]©u@œ~¡Ïð”+\í}>|ˆ;_"ÜvŒI}K´ŽaKr2’?Çi†&zá±i9@MÆ7›ðÊ2;þ¤EQnä¥îM NZ¡¦C
...


Im Großen und Ganzen geht das Parsen ganz gut, allerdings ist ein schlauer Mensch
bei der Spezifizierung des Formats wohl auf die gloreiche Idee gekommen den Tag
für den öffentlichen Schlüssel einfach mit "ÖS", also mit einem Umlaut zu kennzeichnen.
Alle anderen Tags finde ich sofort, aber das ÖS macht probleme. Ich habe nun schon
versucht die entsprechenden Hex-Werte abzugleichen. Leider ohne Erfolg. Was mache
ich beim Einlesen der Datei falsch? Hier mein Code:


Code:
RandomAccessFile in = new RandomAccessFile(filename, "r");
byte file[]  = new byte[(int) in.length()];
			
// read full file
in.readFully(file);


for (int i = 0; i < file.length -1 ; i++) {

if ( (file[i] == 0x52 && file[i+1] == 0x44) || //RD
     (file[i] == 0x44 && file[i+1] == 0x4D) )  //DM
	{
            // do something
	};
					
					
else if (file[i] == 0xd6 && file[i+1] == 0x53){    //ÖS
          // do something other
	   };

}

Die Tags "RD" und "DM" findet er ohne Probleme. Das ÖS überspringt er aber völlig.
Hoffe mal irgendwer kann mir weiterhelfen.
 
nachdem das Ö nicht im ASCII Code ist, wirst du wohl den Spezialisten fragen müssen, wie es kodiert wurde

Der Inhalt wirkt etwas kryptisch, was auch so richtig ist, weil die Datei zwar ein Klartextformat...

Entweder es ist Klartext oder nicht, und wenns Klartext ist, dann sollte man Binärdaten da nicht einfach reinschreiben sondern entprechend kodieren (base64, hex, ...)
 
ja und, das ist schon richtig
Code:
System.out.println(Arrays.toString("Ö".getBytes("ISO-8859-1")));
System.out.println(Arrays.toString("Ö".getBytes("UTF-8")));
System.out.println(Arrays.toString("Ö".getBytes("UTF-16")));
/* liefert
[-42]
[-61, -106]
[-2, -1, 0, -42]
*/
 
nachdem das Ö nicht im ASCII Code ist, wirst du wohl den Spezialisten fragen müssen, wie es kodiert wurde

Also die Datei scheint ANSI-codiert zu sein. Zumindest wird das Ö mir in einem Hexeditor mit D6
dargestellt. Lasse ich mir den Inhalt des Feldes mit Integer.toHexString(file[1881]) ausgeben,
liefert mir Java dafür den Hex-Wert ffffffd6.
Dies ist aber als Integer -42 und nicht 214, wie es unter ANSI sein sollte. Versucht Java standardmäßig
ISO-8859-1 zu lesen?

Wie gesagt ist die Datei großteils Klartext, enthält aber gekryptete Passagen, die die Schlüssel enthalten.

Naja, ich versuche mal ein bißchen mit verschiedenen Codierungen herumzuspielen.
Vielen Dank
 
das ding wird nach int promoted (deshalb ffffffd6) und ist genau das richtige Byte (nur für die Ausgabe wird -42 geschrieben)

und: 0x6d ist ein int literal, der aber 214 ist, und die linke Seite des vergleichs wird zum int -42 gecastet...

versuch
Code:
      if(file[i]==-42){
            System.out.println("gefunden");
        }
        if(file[i]==(byte)0xd6){
            System.out.println("gefunden");
        }
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben