kostenloser Webspace werbefrei: lima-city


Hexadezimal

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Ich möchte einen Text speichern, den ich als eine Reihe von Hexadezimalzahlen habe.
    Die Hexadezimalzahlen habe ich in Form eines Strings in m[ ] abgespeichert:
    m[0] = "00 FF ...

    Wenn ich diese mit der folgenden Funktion in einen echten Text umwandle, um ihn später mit
    writer.write(funktion(0));

    in der Datei abzuspeichern, und diesen später in einem Hexadezimaleditor ansehe, muss ich festellen, dass Java manche Zeichen falsch angegeben hat. So speichert Java alle Hexdezimalzahlen von 80 bis 9F als 3F (="?") ab.

    Ausschnitt aus der Funktion, mit der ich die Hexadezimalzahlen in einen String umwandle:
    StringBuffer stb = new StringBuffer();
    StringTokenizer tokenizer = new StringTokenizer(m[i]);
    while (tokenizer.hasMoreTokens()) {
            stb.append((char) Integer.parseInt(tokenizer.nextToken(), 16));
    }
    return stb.toString();


    Was muss ich tun, damit keine Informationen verloren gehen?

    Beitrag zuletzt geändert: 30.8.2009 14:55:15 von toolz
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Wie ist denn der komplette Datentyp von m?

    Im Moment sieht das für mich so aus, als wenn du jedes einzelne Zeichen bzw. Ziffer(!) einliest an Stelle von zusammenhängende Zahlen.
    i = 0 -> "0"
    i = 1 -> "0"
    i = 2 -> " "
    i = 3 -> "F"
    i = 4 -> "F"
    i = 5 -> ...

    Ich empfehle dir dir mal die Funktion String.split() anzuschauen. Dann musst du nicht mit den Tokenizern rummachen.

    p.s. 3F steht in ASCII für das Fragezeichen. Und Hex 80 ist der Dezimale Wert 128. Die ASCII Tabelle geht aber nur von 0 bis 127.
    Wobei Java intern Unicode verwendet. Aber vllt sind die verwendeten Klassen da etwas eingescrhänkt. Man müsste mehr von deinem Code sehen, um mehr dazu sagen zu können.

    Beitrag zuletzt geändert: 30.8.2009 15:38:22 von bladehunter
  4. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Neinenin.
    m[ ] sieht so aus:

    m[0] = "AA 00 D3 ...
    m[1] = "85 12 89 ...

    Es sind einfach verschiedene Hexadezmimal- Texte.

    Es ist mir außerdem egal, welchen Buchstaben das in dem Text ergibt, ich brauche nur die Hexadezimalzahlen.
    bladehunter schrieb:
    p.s. 3F steht in ASCII für das Fragezeichen.

    toolz schrieb:
    [...] als 3F (="?") ab.


    Der gepostete Code ist der einzige Teil, der sich auf m[ ] bezieht, mehr braucht ihr nicht, wäre auch viel zu lang.


    Also kann es sein, dass ich Hexazahlen ab 80 nicht in eine Textdatei schreiben kann? Gibt es da nicht irgendeine Möglichkeit?
    Mir wäre es auch recht, wenn das Problem anders gelöst würde, hauptsache, ich kann in eine Datei die Hexadezimalzahlen schreiben.

    Beitrag zuletzt geändert: 30.8.2009 16:49:48 von toolz
  5. toolz schrieb: Neinenin.
    m[ ] sieht so aus:

    m[0] = "AA 00 D3 ...
    m[1] = "85 12 89 ...

    Es sind einfach verschiedene Hexadezmimal- Texte.

    Was immer noch nicht die Frage beantwortet. Mit welchem /Datentyp/ bzw. welcher Klasse haben wir es hier zu tun?


    bladehunter schrieb:
    p.s. 3F steht in ASCII für das Fragezeichen.

    toolz schrieb:
    [...] als 3F (="?") ab.

    Jup. Habe ich gesehen.


    Der gepostete Code ist der einzige Teil, der sich auf m[ ] bezieht, mehr braucht ihr nicht, wäre auch viel zu lang.

    Nagut. Wobei ich schon noch vermute, dass der Fehler auch woanders stecken könnte.


    Also kann es sein, dass ich Hexazahlen ab 80 nicht in eine Textdatei schreiben kann?

    Nein. Das sollte überhaupt kein Problem sein.
    Du kannst dir auch mal die Funktion format() anschauen. Dann kannst du intern mit int-Variablen arbeiten und diese Funktion kann dir mit dem geeignetem Format-Code das ganze korrekt in Hex konvertieren.
    format() gehört zur PrintStream Klasse, welche von OutputStream erbt. Falls du sowieso mit OutputStream arbeitest, sollte eine Anpassung halbwegs einfach sein.

    Hast du dir jetzt mal String,split() angeschaut?

    Beitrag zuletzt geändert: 30.8.2009 17:14:20 von bladehunter
  6. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Also es handelt sich bei m[ ] um einen String, aber ich wollte mich nicht festlegen, jeder Datentyp ist möglich.

    split() kenne ich, hat aber nichts mit meinem Problem zu tun, denn es funktioniert in meinen Augen.

    Das Problem liegt ja darin, dass der FileWriter einen Datentyp braucht, den er in eine Datei schreiben kann und meines Wissens gibt es da keinen Hexadezzimaldatentyp. Und wenn ich Hexadezimal in einen String umwandle (so wie im Codeauszug) bilden sich Fehler, weil String anscheinend nur Zeichen des ASCII verwendet...
  7. Also, da format() eher eine kompliziertere Funktion ist, habe ich dir mal ein Beispiel geschrieben:

    public class Hex {
    
            public static void main( String[] args ) { 
                    int a = 0xa6; // dezimal = 166
                    Object[] arg = { new Integer( a ), new Integer( a ) };
                    System.out.format( "Dez: %d Hex: %x\n", arg );                 
            }   
    }

    Die Funktion format() bekommt als ersten Parameter einen so genannten Format-String. In solchen Strings spielen bestimmte Abschnitte eine besondere Rolle, wenn sie mit einem % beginnen. %d bedeutet zum Beispiel, dass an dieser Stelle eine Dezimalzahl eingefügt werden soll und ein %x bedeutet dass die Ausgabe eine Hex-Zahl sein soll.
    Der 2. Parameter ist ein Array von Objekten. Für jedes % im 1. Parameter-String wird ein Objekt aus dem Array genommen und eingesetzt. In diesem Fall haben wir die Variable a 2 mal im Array stehen, so dass sie 2 mal auf verschiedene Art ausgegeben wird.

    Die Umwandlung von a zu einem Integer ist notwendig, da ints keine Objekte sind und wir Objekte brauche und keine nativen Datentypen.
  8. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    So wie ich das sehe, ist es ziemlich umständlich, die Hexadezimalzahlen alle einzugeben...
    Es handelt sich um ~2600 Zahlen :biggrin:

    Außerdem wird das Ganze ja nur ausgegeben und nicht in eine Datei geschrieben...
  9. e********l

    Wieso schreibst du deinen Hex String nicht einfach als String in die Datei? Denn wenn es geschrieben ist, ist es entweder text oder binär. Was anderes, gibt es nicht. Einzig die Interpretation kann als Hex erfolgen. Wobei Hex als Hex zu interpretieren sicherlich komische Resultate liefern wird.
  10. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Wenn man das so leicht machen könnte.
    Aber wenn ich die Hexadezimalzahlen reinschreibe, werden diese nicht als Hexadezimal, sondern als Text interpretiert. Wenn ich den Text, den diese ergeben in Java als String abspeichere, gehen Informationen verloren, weil manche Zeichen 2 mögliche Hexadezimalzahlen haben und Java bei manchen noch die nimmt, die ich nicht brauche.
  11. c****s

    toolz schrieb:Und wenn ich Hexadezimal in einen String umwandle (so wie im Codeauszug) bilden sich Fehler, weil String anscheinend nur Zeichen des ASCII verwendet...

    Java unterstützt seit 1.0 Unicode. Und ich bezweifle, dass du wirklich ASCII meinst. Was machst du denn mit "ä" "ö" und "ß"? Nutzt du Codepages?

    Deine Hexzahlen die du wegschreiben willst sind Bytes, sprich ein Wert zwischen 0 und 255 (beziehungsweise zwischen -128 und 127). Sie liegen dir als String vor im Format [2-Stellige-Hex-Zahl, Leerzeichen]*. Parse also deinen String und schreibe die Bytes in die Datei.

    Das geht so:
    public class Writer
    {
    	public static void main (String [] args) throws Exception
    	{
    		String m = "aa 3f 31 93 f4 66 b2 4d";
    		java.io.FileOutputStream fos = new java.io.FileOutputStream ("d:\\numbers");
    		for (String n : m.split (" ") )	fos.write (Integer.parseInt (n, 0x10) );
    		fos.flush();
    		fos.close();
    	}
    }


    EDIT: Anstelle von D:\numbers solltest du einfach die Datei angeben, wo du die Ausgabe haben willst.

    Beitrag zuletzt geändert: 30.8.2009 19:55:30 von census
  12. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Schön, das funktioniert, aber auch nur so weit, wie der Code, den ich am Anfang gepostet habe :wink:
    Der schreibt für manche Zeichen den falschen Hexacode auf.
  13. c****s

    toolz schrieb:
    Schön, das funktioniert, aber auch nur so weit, wie der Code, den ich am Anfang gepostet habe :wink:
    Der schreibt für manche Zeichen den falschen Hexacode auf.


    Also mein Code erzeugt eine Datei, die im Hexeditor betrachtet, haargenau dieselben Werte hat wie der Eingangsstring.

    Auch hier: Wäre nett wenn ein dritter sich das mal anschauen würde. Danke

    EDIT: Zum Beispiel das 9A (das ja zwischen 80 und 9F) wird auch als 9A geschrieben. Das dein Notepad das als ? anzeigt ist klar.

    EDIT2: Hier eben der Beleg dafür: http://census.lima-city.de/Bildschirmfoto.png

    Beitrag zuletzt geändert: 30.8.2009 20:18:35 von census
  14. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Ich öffne das schon mit einem Hexadezimaleditor.
    Aber:
    Ich habe die Strings jetzt mal direkt so, wie in deinem Code, geschrieben (vorher waren die in einer eigenen Klasse, die sie besitzt und mit meinem Code umwandelt) und dann gings auf einmal. :confused:

    Danke euch allen, besonders census, es klappt.
  15. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!