1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

File einlesen, splitten und rausschreiben => Problem (Encoding?)

  • AntiBit
  • 29. November 2006 um 16:02
  • Unerledigt
  • AntiBit
    13
    AntiBit
    Mitglied
    Reaktionen
    2
    Punkte
    1.712
    Beiträge
    297
    • 29. November 2006 um 16:02
    • #1

    Hi! Um mein Problem kurz zu beschreiben:

    Hab eine Datei, die implizit aus mehreren *.wav Dateien besteht.
    Wenn ich diese Datei nun in Java einlese, an bestimmten Punkten splitte und diese einzelnen Splits als neue *.wav-Dateien rausschreibe, so geht mir ein wenig Information verloren. Die waves hören sich dadurch etwas "scrambled" und nicht klar an. Ich weiß aber nicht woran das liegt :confused:

    Zum Glück hab ich eine (klare) Referenz-Ouput-Wave Datei. Wenn ich diese Datei in einem HEX-Editor öffne und mit dem äquivalenten Output-Pendant meines Programmes im HEX-Editor vergleiche, so stelle ich kleine Unterschiede fest:

    Alle HEX-Blöcke die im guten File "90" sind, sind in meinem Output "BF" (BF = ?)
    Auch alle "89"er im Guten sind in meinem "BF"
    "9B" im Guten ist ebenfalls "BF" bei meinem Output
    Das gilt auch für 91er, vielleicht auch noch für ein paar wenige andere.

    Sonst stimmt die Datei großteils überein, darum kann man sich meine waves ja auch noch anhören, man erkennt sie auch, sie sind halt etwas vermurkst durch diese ungleichen Sektoren.

    Kann mir jemand helfen, woran liegt das?
    Hier noch mein Source, ist nicht wirklich lang:

    Code
    public static void main(String[] args) {
    
            File f = new File("input");
            try
            {
                byte[] b = getBytesFromFile(f);
    
                String s = new [B]String(b)[/B];
                String[] parts = s.split("RIFF4");
    
                for(int i=0;i<parts.length;i++)
                {
                    parts[i] = "RIFF4"+parts[i];
                    byte[] targetBytes = parts[i].getBytes(); 
                    String fName = "teil" + i + ".wav";
                    FileOutputStream fos = new FileOutputStream(fName);
                    fos.write(targetBytes);
                    fos.flush();
                    fos.close();
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }        
        }
    
        public static byte[] getBytesFromFile(File file) throws IOException {
            InputStream  is = new FileInputStream(file);
    
            long length = file.length();    
    
            if (length > Integer.MAX_VALUE) {
                // File is too large
            }    
    
    
            byte[] bytes = new byte[(int)length];
            int offset = 0;
            int numRead = 0;
            while (offset < bytes.length
                   && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
                offset += numRead;            
            }
    
    
            if (offset < bytes.length) {
                throw new IOException("Could not completely read file "+file.getName());
            }
    
    
            is.close();
            return bytes;
        }
    Alles anzeigen

    Hab auch ein wenig mit Encodings bei der FETT-markierten Stelle rumgespielt, das verschlechtert die Sache aber eher noch.
    :confused: Jemand Rat parat :confused:

    Hätten uns Spiele wie Pac-Man in unserer Jugend beeinflusst, würden wir heute durch dunkle Räume irren, elektronische Musik hören und Pillen fressen.

  • kubuntu
    6
    kubuntu
    Mitglied
    Reaktionen
    2
    Punkte
    352
    Beiträge
    65
    • 29. November 2006 um 16:20
    • #2

    Du solltest nicht das Byte[] in den String konvertieren und wieder zurueck. Alleine der Satz in der Java API Doc sollte alles sagen: The length of the new String is a function of the charset, and hence may not be equal to the length of the byte array.

    Such lieber haendisch nach dem "RIFF4" Pattern. Ne andere Idee haett ich jetzt auch ned.


  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 29. November 2006 um 16:37
    • #3

    Naja, es gibt ja String-Konstruktoren, bei denen man die Codierung angeben kann, damit kann man spielen. Und dann bei getBytes das selbe Charset angeben nicht vergessen... (Aber ja, rein vom Konzept her ist es inelegant, das mit String zu machen. Gut, es ist schon inelegant, das in Java zu machen...)

    *plantsch*

  • AntiBit
    13
    AntiBit
    Mitglied
    Reaktionen
    2
    Punkte
    1.712
    Beiträge
    297
    • 29. November 2006 um 17:25
    • #4
    Zitat von Plantschkuh!

    bei getBytes das selbe Charset angeben nicht vergessen...

    Ineleganz hin oder her, DAS war mein Fehler!
    Jetzt klappts :)

    Danke euch!

    Hätten uns Spiele wie Pac-Man in unserer Jugend beeinflusst, würden wir heute durch dunkle Räume irren, elektronische Musik hören und Pillen fressen.

  • Maximilian Rupp 27. Dezember 2024 um 12:05

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung