tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
396
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Jun 2011
    Beiträge
    11
    Guten Morgen miteinander

    Ich hänge an einem extrem kniffligen Problem, dass es so im Internet nicht zu lösen gibt und wo ich wirklich nen guten Rat gebrauchen könnte.
    Das ganze drum herum erspare ich und komme direkt zum Punkt:

    der Firefox-Cache liefert mir zu jedem Bild, dass ich im Internet aufgerufen habe, die dazugehörige Hex-Tabelle. D.h. Wenn ich diese Hextabelle in einen Hex-editor schmeiße und diese Datei dann also *.jpg speichere, erscheint das bild.

    Das ganze soll java für mich machen .

    Code java:
    1
    2
    3
    4
    5
    6
    
    StringBuilder sb = new StringBuilder();
            for (String a : tbytes ) {
                  int c = Integer.parseInt(a,16);
                  char chr = (char)c;
                  sb.append(chr);
            }
    Ich habe natürlich längst gelöst, wie ich hex in ascii umwandle.
    Mein Problem ist aber, dass das Firefox-Bild, dass ich aus dem Cache geholt habe, scheinbar zeichen enthält, die die Ascii-Umwandlung von java nicht hinbekommt. So kommen an viele Stellen ein "?" anstelle des Zeichens, dass ich brauche.

    "ƒ„…†‡ˆ‰Š’“”•–—˜™š" <-- diese sind in der Tabelle, die Firefox-Cache zu bildern liefert, enthalten. Und wenn ich diese Tabelle in einen Hexeditor schmeiße, gibt er sie mir auch korrekt nachher aus.
    Nur java kriegt das nicht gebacken! Lösungsvorschläge?

    Das Hauptproblem scheint auch allgemein darin zu liegen, dass ASCII generell ja nur 127 Zeichen enthält. Hinzu kommt dann aus irgendeinem grund eine ascii-Sondertabelle.

    Erst, wenn ich im Internet nach "Ansi Codetabell" google, kriege ich eine Tabelle mit Zahlen bis 255, die auch die von mir benötigten Sonderzeichen enthalten. Aber Kann java die überhaupt verarbeiten bzw. abspeichern?
     

  2. #2
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hi,
    mein Vorschlag wäre das Ganze auf Byte-Ebene zu machen und nicht auf String-Ebene. D.h. du nimmst die Hex-Tabelle und wandelst diese in einen Binärcode und nicht in einen ASCII-Code um. Dann kannst du die Bytes auch direkt wieder schreiben. Hier ein Beispiel zum schreiben eines Byte[] zu einem Image.

    Gruß

    Fabio
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  3. #3
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    So wie ich das verstehe liefert dir der Firefox Cache die Bilder direkt als Bytes. Da mußt du überhaupt nichts mehr umwandeln, sondern die Daten einfach 1:1 auf die Platte durchschreiben.

    Ansonsten zeig mal wie du die Daten von Firefox bekommst.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  4. #4
    Registriert seit
    Jun 2011
    Beiträge
    11
    http://tinyurl.com/6bxqogc
    So kriege ich die Daten von Firefox. Sind also keine bytes, sondern hex-Werte. Ich krieg einfach den Schritt von hex->bild nich gebacken. Ich habe einfach gedacht, ich wandle die hex-werte in die Ascii-zeichen um und schreibe sie in eine Datei. Die Datei wird dann letztendlich als bild repräsentiert

    @Fabio
    Ich kann mir gerade nicht vorstellen, wie das funktionieren kann. Ich wandle also die hexa-werte in binärwerte (8bit werte also) um und kann daraus ein Bild erzeugen? Ist das korrekt?
     

  5. #5
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Meiner Meinung nach geht das. Ich habe das selber zwar noch nicht gemacht, aber wenn man sich mal überlegt, dass für die Maschine alles nur 0 und 1 ist, kann man den Hex-Code schließlich auch in Binär-Code umwandeln und diesen dann auf die Platte schreiben. Soweit die Theorie.

    // EDIT: Link hinzugefügt
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von fReAkgoesTutorials Beitrag anzeigen
    http://tinyurl.com/6bxqogc
    So kriege ich die Daten von Firefox.
    Das ist bereits eine Interpretation / Darstellung der Daten. Wie bekommst du denn die Daten? Oder rufst du einfach Firefox auf, kopierst dir die Daten ins Clipboard? Zeig doch mal deinen Code.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    Registriert seit
    Jun 2011
    Beiträge
    11
    Dass die Umrechnung klappt, ist selbstredend. Dass der Rechner nur in 1 und 0 spricht (strom da/strom nicht da), auch selbstredend. Aber diese Funktionen von deinem Link passen da irgendwie nicht rein. Ich kriege nicht mal ansatzweise eine Idee, wo ich dort die bits reinklatsche und dann noch ein Bild bekomme.

    Wichtige Info nebenbei: Die Größe des Bildes ist in den Bildinformationen enthalten d.h. sie werden nicht von mir vorgegeben.
    Die oben verwendeten Klassen benötigen immer eine fixe fest vorgegebene Größe, weswegen das wohl nicht funktionieren wird :/...

    Andere Ideen?

    @deeothroat
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    
        protected void saveImage(String imageUrl, String destinationFile) throws IOException {
            LinkedList<String> bytes = new LinkedList<String>();
            String[] tbytes = new String[16];
            selenium.open(imageUrl);
            elmnt = driver.findElement(By.xpath("/html/body/pre"));
            String convert = elmnt.getText();
            String textfile = "C:\\text.txt";
            File f = new File(textfile);
            if(!f.exists()) {
                f.createNewFile();
            }
            try {
                BufferedWriter out = new BufferedWriter(new FileWriter(textfile));
                out.write(convert);
                out.close();
                BufferedReader in = new BufferedReader(new FileReader(textfile));
                
                String zeile = "";
                while ((zeile = in.readLine()) != null) {
                    tbytes = zeile.substring(11,73).split("  ");
                    for(String tbyte : tbytes) {
                        bytes.add(tbyte);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            tbytes = new String[bytes.size()];
            for(int i = 0; i<bytes.size(); i++) {
                tbytes[i] = bytes.get(i).trim();
                
            }
            
            StringBuilder sb = new StringBuilder();
            for (String a : tbytes ) {
                  int c = Integer.parseInt(a,16);
                  char chr = (char)c;
                  sb.append(chr);
            }
            
            try {
                File f1 = new File("C:\\bild.jpg");
                if(!f1.exists()) {
                    f1.createNewFile();
                }
                PrintStream ps = new PrintStream("C:\\bild.jpg");
                ps.print(sb.toString());
                ps.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    Wollte nicht gleich komplett euch mit Code zubomben, weils schon viel ist und für außenstehende nicht immer sofort ersichtlich.

    Hier passiert eigentlich nur folgendes:
    Ich rufe die Seite auf, hole mir per xpath den HTML-Content im feld "pre", speichere diesen zwischen in eine Textdatei.

    Danach rufe ich die Textdatei wieder auf und hole mir zeile für zeile immer die zeichen zwischen 11 und 73 (also die 16-Hexawerte).

    Das ganze wird gesplittet und jeder einzelne Hexa-doppel-wert wird in eine LinkedList eingebaut und danach noch in ein String-Array geschrieben.

    Am ende des liedes wird ein Stringbuilder erzeugt, der für jeden String die oben schon beschriebene Funktion aufruft, also den doppelten Hexawert parst und umwandelt und anhängt.

    EDIT: standen 2-3 unwichtige Sachen im Code, habe ihn mal gekürzt
    Geändert von fReAkgoesTutorials (04.11.11 um 16:08 Uhr)
     

  8. #8
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Zitat Zitat von deepthroat Beitrag anzeigen
    Das ist bereits eine Interpretation / Darstellung der Daten.
    Da muss ich deepthroat Recht geben. Die Daten sind schon in Hex-Code umgewandelt wurden.
    Als ich mir mal einen Proxyserver geschrieben habe, hab ich auch alle Daten auf Byte-Ebene empfangen und verarbeitet.
    Zitat Zitat von deepthroat Beitrag anzeigen
    Wie bekommst du denn die Daten? Oder rufst du einfach Firefox auf, kopierst dir die Daten ins Clipboard? Zeig doch mal deinen Code.
    Das wäre in der Tat noch eine hilfreiche Information.
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  9. #9
    Registriert seit
    Jun 2011
    Beiträge
    11
    Habs gepostet genau über dir , haben uns wohl verpasst.
    Also ich "kopiere" die daten aus dem Clipboard heraus mit Selenium
     

  10. #10
    Registriert seit
    Jun 2011
    Beiträge
    11
    Ich habs gelöst! Folgendes ist mit dem obigen hexcode notwendig:

    1. Alle Hexa-zeichen aneinanderhängen
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    StringBuilder sb = new StringBuilder();
            for (String a : tbytes ) {
                /*
                  int c = Integer.parseInt(a,16);
                  char chr = (char)c;
                  sb.append(chr);
                  */
                sb.append(a);
            }
    2. die hex-zeichen in bytes konvertieren:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
        public static byte[] hexToBytes(char[] hex) {
            int length = hex.length / 2;
            byte[] raw = new byte[length];
            for (int i = 0; i < length; i++) {
                int high = Character.digit(hex[i * 2], 16);
                int low = Character.digit(hex[i * 2 + 1], 16);
                int value = (high << 4) | low;
                if (value > 127)
                    value -= 256;
                raw[i] = (byte) value;
            }
          return raw;
        }
    3. die Datei mithilfe von Bytes aufbauen
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
        public static boolean erstelleDatei(byte[] datei, String pfad)
        {
            FileOutputStream outStream;
            if(datei.length <= 0)
                return false;
            try {
                outStream = new FileOutputStream(pfad);
                outStream.write(datei,0,datei.length);
                outStream.close();
            } catch (FileNotFoundException e) {
                            e.printStackTrace();
                return false;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }

    Danke trotzdem für euer Bemühen. Gerade die Aussage mit den "zu Bytes konvertieren" hat den richtigen Denkanstoß mit sich gebracht
    Einen schönen Abend noch und Grüße,

    fReAk
     

Ähnliche Themen

  1. Betriebssystem installieren und später deinstallieren
    Von yax im Forum Microsoft Windows
    Antworten: 14
    Letzter Beitrag: 29.03.11, 18:10
  2. [C++]WinMain() später laden
    Von Ninjasturm im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 01.09.10, 20:29
  3. DB Reihe später was hinzufügen!
    Von X-Cheats im Forum PHP
    Antworten: 2
    Letzter Beitrag: 20.07.09, 23:00
  4. später übergabe der parameter
    Von zapp91 im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 19.09.07, 18:07
  5. Teil der Seite später laden
    Von stonk im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 11.02.07, 19:04