zip-Datei auslesen



  • Hallo,

    kann mir jemand weiterhelfen und sagen wie ich eine zip-Datei die Hex-Werte enthält in einem String darstellen kann?

    Danke



  • Wie soll ich das verstehen ... du hast in einem zip archiv einige dateien gespeichert

    die daten stehen in einer datei und willst diese jetzt hexadezimal darstellen??

    sehe ich das richtig?

    also hast du das zip file öffnen auslesen schon gemacht oder nicht?



  • Es ist etwas komplizierter: im eigentlichen Sinne habe ich kein zip-File, sondern ein cap-File in dem hex-Werte drin stehen. Ich möchte nun dieses cap-File in meiner javaUmgebung öffnen und den Inhalt, also die Hex-Werte z.B. in einem jEditorPane anzeigen!! Leider bekomme ich diese File nicht geöffnet bzw. lese mit dem FileReader irgentwas ein, nur nicht die HexWerte!!
    Ich hoffe dass ich die Problematik verständlich erklärt habe! 🙄 und du mir oder ihr mir weiterhelfen könnt

    Danke



  • Falls diese Datei nicht aus Java heraus gespeichert wurde, denk' daran, daß Java Big-Endian-Codierung verwendet!
    Falls sie also z.B. auf x86-Plattformen unter C / C++ gespeichert wurde, ist sie Little-Endian-codiert! 💡



  • Tja, damit kann ich nun nichts anfangen! Was bedeutet das genau, ausser eine Inkompatibilität kann ich mir keinen reim draus machen! Heisst es dass Dateien die nicht mit JAVA gepackt sind auch nicht ausgelesen werden können? Letztendlich ist die cap-Datei ja nichts anderes als HEX-Werte. Wie könnte ich die denn auslesen? Müsste doch eigentlich mit nem FileReader gehen oder!!?? AUf die zip-Geschichte bin ich nur gekommen, weil man mit Winzip an die einzelnen Komponenten kommt!
    Ist alles etwas kompliziert ich weiss, sorry!



  • Ich würde bei einer binären Datei auch nicht unbedingt einen Reader nehmen sondern den reinen Stream. Die Bytes lassen sich dann prima nach hex konvertieren und anzeigen.



  • Was Nukem damit sagen will ist, Du musst beim Einlesen darauf achten, das Du evt. die Bytes tauschen musst. Relativ komfortabel geht das mit einem Bytebuffer und den FileChannels. Beim ByteBuffer kannst Du dann die ByteOrder auswählen.



  • Für 2 HEX-Werte mußt Du logischerweise immer 8 Bit = 1 Byte zusammen speichern / lesen.
    Man könnte mit dem LSB (least significant bit = unwesentlichstes Bit = das Bit, das die 20 repräsentiert) beginnen, oder mit dem MSB (most s. b. = wesentlichstes Bit = 27). Man könnte natürlich auch immer 4 zusammennehmen und in beliebiger Reihenfolge speichern, etc. pp. Ist ja egal.
    Das Problem ist nur: Um die Daten sinnvoll wieder verwerten zu können, muß man sie genau so lesen wie sie gespeichert wurden!
    Üblicherweise werden die 8 Bit immer gleich zu einem Byte gespeichert, allerdings werden Byte-Folgen unterschiedlich gespeichert:
    Wenn ich mit einem C++ Programm unter Windows auf einer x86 Maschine eine Binärdatei speichere, wird sie Little-Endian-codiert, d.h. das LSB zuerst (hier steht B für Byte, nicht Bit).
    Auf einer SUN SPARC Maschine oder einem Amiga mit Motorola Prozessor wird die Datei halt Big-Endian gespeichert.
    Siehe auch http://home.t-online.de/home/uwe.mnich/Wissen/Messtechnik/tmKap5/tmKap513/tmKap513.html

    Sun mußte sich aufgrund der Plattformunabhängigkeit für eins entscheiden und hat Big-Endian genommen.
    So kannst Du auf jeder Java-Maschine (ob SPARC oder Intel x86) eine in Java gespeicherte Datei auch von Java wieder einwandfrei lesen.
    Probleme treten nur auf, wenn Du "externe" - d.h. nicht von Java gespeicherte Dateien lesen willst: Hier mußt Du das Format kennen. Big-Endian ➡ Kein Problem. Little-Endian ➡ Du mußt konvertieren!

    Da Du geschrieben hast, daß Du zwar Werte, aber unsinnige, herausbekommst, überprüf' das mal mit einem Hex-Editor:

    Speicherst Du von einem Programm unter Win32 "1345" als int ab, sieht das HEX so aus:
    41050000 = 41 05 00 00

    d.h. 1 * 160 + 4 * 161 + 5 * 162 + 0 * ... = 1 + 64 + 1280 =
    1345

    Liest Du das Ding mit Java ein, macht das daraus aber:
    41050000 = 00 00 05 41

    d.h. 5 * 164 + 0 * 165 + 1 * 166 + 4 * 167 = 327.680 + 16.777.216 + 1.073.741.824 = 1.090.846.720

    - eine Zahl die Du sicher nicht auslesen wolltest.

    Ich weiß das, weil's mir selber mal derbst den Kopf zerbrochen hat. 🕶

    Aber vielleicht postest Du mal besser genauere Infos. Kurzer Ausschnitt aus diesem ominösen File, Code wie Du es lädst, und Erklärung, was eigentlich (!) rauskommen soll...

    🤡 👍



  • Wow, danke erstmal für die ganzen Infos! 👍

    Ok hier ist dann mal ein Auszug bzw nähere Infos was soll und was ist:

    Das bekomme ich, wenn ich mir den ausgelesenen String als System.out.println augeben lasse:    0 ÿÿÿÿ‰ Ý <- MIST

    Das soll es im String sein (Ausgabe aus HexEditor):03 00 14 01 10 A0 00 00 00 30 00 02 FF FF FF FF 89 00 00 02 01 01

    Hoffe es ist ein gutes Bsp.! Danke nochmals für die Hilfe


Anmelden zum Antworten