1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • 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
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • AntiBit
    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:

  • kubuntu
    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!
    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...)

  • AntiBit
    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!

  • Maximilian Rupp 27. Dezember 2024 um 12:05

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum