Bytearray iist zip? (magic numbers)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Bytearray iist zip? (magic numbers)

    Hey Leute

    ich habe von einer url etwas als byte[] heruntergeladen. Im besten fall ist dies eine zip datei.
    Genau das will ich überprüfen. Der einfachste weg der sich aber als kompliziert herausstellte ist
    die ersten 5 bytes (magic number) zu lesen, die wie ich aus recherchen habe eine identifikationsnummer für Dateitypen sein soll.
    Mein problem ist jedoch das ich unbekannte zeichen herausbekomme. -> (PK����Æ^6N���)
    Ich habe auch schon andere Charsets versucht, aber es kamm bis her immer das gleiche unlesbare Zeug.

    Hier mein short code:

    Quellcode

    1. Log.i(TAG, new String(byteZip, StandardCharsets.UTF_8));
    Falls jemand eine idee hat oder auch eine alternative lösung, bitte her damit. =D
  • Am besten erstellst du aus deinem Byte-Array erstmal eine Datei (oder noch besser, du schreibst beim Download schon eine Datei), gerade bei größen Zips nutzt/blockierst du durch dein Byte-Array natürlich viel Arbeitsspeicher (ist die Zip größer als dein Arbeitsspeicher, wirst du so auf Fehler stoßen).

    Nachdem du die Datei geschrieben hast, kannst du mit der ZipFile-Klasse (docs.oracle.com/javase/8/docs/…ava/util/zip/ZipFile.html) in Java überprüfen, ob die Zip funktionert/valide ist.

    Noch besser wäre es wenn du einen Checksum-Prüfung einbaust (dafür muss dir der Server allerdings die Checksum mitteilen), dann wüsstest du ob die Datei wirklich korrekt runtergeladen wurde.

    Bytes kannst du übrigens nicht zuverlässig als String darstellen, dort wirst du immer so "unbekannte" Zeichen rausbekommen.
  • Hallo
    Das was du hast ist ja kein String sondern ein Byte Array.
    Wie du richtig sagst kann man ein Zip an dem Anfang erkennen der ist PK und dann kommen angaben in Hex.
    hummel1.de/prog/zipview/zipstruc.htm

    Schaue dir mal ein Zip mit einen Hex-Editor an.

    Die Bytes nach den ersten Zwei „PK“ sind keine Charter die im ASCII Code ein Zeichen oder Buchstaben entspricht, deshalb die komischen Zeichen. Die du als Platzhalter sehen kannst.
    Weil das keine Druckbaren, Anzeigbaren Zeichen sind. Der hex wert ist trotzdem vorhanden.

    In Punkto Speicherverbrach hat @Xcreen natürlich recht. Wenn es nur wenige Bytes sind und nicht erst eine Datei erstellen willst, du das Array am Anfang auf das „PK“ prüfen willst dann in etwa so.

    Quellcode

    1. byte[] zipArray = {0x50, 0x4b, 0x03, 0x04, 0x14, 0x20, 0x02, 0x20, 0x08, 0x20};
    2. String zipString = "";
    3. for (int i=0; i<4; i++){
    4. zipString= zipString+zipArray[i];
    5. }
    6. if( zipString.equals("807534")) {
    7. // ist ein Zipfile
    8. }
    9. // hier wird leider noch mehr speicher verbraucht
    10. // weil das ByteArry in ein StringArry gewandelt wird so wie du es gemacht hast
    11. zipString = new String(zipArray);
    12. String st = zipString.substring(0,4);
    13. String testZip = "PK"+(char)0x03+(char)0x04;
    14. if (st.equals( testZip )){
    15. // ist ein Zipfile
    16. }
    Alles anzeigen
    Ein Feedback auf Tipps ist auch schön. :P
  • jogimuc schrieb:

    Hallo
    Das was du hast ist ja kein String sondern ein Byte Array.
    Wie du richtig sagst kann man ein Zip an dem Anfang erkennen der ist PK und dann kommen angaben in Hex.
    hummel1.de/prog/zipview/zipstruc.htm

    Schaue dir mal ein Zip mit einen Hex-Editor an.

    Die Bytes nach den ersten Zwei „PK“ sind keine Charter die im ASCII Code ein Zeichen oder Buchstaben entspricht, deshalb die komischen Zeichen. Die du als Platzhalter sehen kannst.
    Weil das keine Druckbaren, Anzeigbaren Zeichen sind. Der hex wert ist trotzdem vorhanden.

    In Punkto Speicherverbrach hat @Xcreen natürlich recht. Wenn es nur wenige Bytes sind und nicht erst eine Datei erstellen willst, du das Array am Anfang auf das „PK“ prüfen willst dann in etwa so.

    Quellcode

    1. byte[] zipArray = {0x50, 0x4b, 0x03, 0x04, 0x14, 0x20, 0x02, 0x20, 0x08, 0x20};
    2. String zipString = "";
    3. for (int i=0; i<4; i++){
    4. zipString= zipString+zipArray[i];
    5. }
    6. if( zipString.equals("807534")) {
    7. // ist ein Zipfile
    8. }
    9. // hier wird leider noch mehr speicher verbraucht
    10. // weil das ByteArry in ein StringArry gewandelt wird so wie du es gemacht hast
    11. zipString = new String(zipArray);
    12. String st = zipString.substring(0,4);
    13. String testZip = "PK"+(char)0x03+(char)0x04;
    14. if (st.equals( testZip )){
    15. // ist ein Zipfile
    16. }
    Alles anzeigen

    Aus irgendeinem Grund habe ich das mit dem String übersehen.
    Natürlich werden die nicht als konkrete Zeichen angezeigt. *facepalm*

    Die Lösung funktioniert nun so, vielen dank.