2009-07-08 9 views
0

Salut à tous. Je lis d'un fichier de format sql à un autre, et deux octets au milieu sont corrompus, et je suppose que c'est une préparation ou une sauvegarde que je n'ai pas faite.RandomAccessFile.write pas écrire ce que je le dis à

Exemple de données corrompues:

//From the file that is read from. added ** to emphasize the corrupted byte 
insert into viruses (virusSig,virusHash) values (
X'579fdc569b170419e15750f0feb360aa9c58d8**90**eede50def97ee7cb03b9e905', 
X'ee002fe5'); 

//From the file that is written to. added ** to emphasize the corrupted byte 
insert into changes (filepath,loc,dat,vir,hash) values (
'E:\MyDocs\intel\antivirus\RandomFiles\0\2\5\11\24\49\EG1AxxeJSr.data', 
243540, 
X'9f4246ff8c73c5a5b470cab8c38416929c4eacc1e0021d5ac1fdbb88145d3e6f', 
X'579fdc569b170419e15750f0feb360aa9c58d8**3f**eede50def97ee7cb03b9e905', 
X'6546dd27'); 

code qui lit/écrit:

public static void insertViruses(FileLocation[] locations, byte[][] viruses, String logpath) 
{ 
    int numViruses = viruses.length; 
    int virusLength = GenerateRandomCorpus.virusSignatureLengthInBytes; 

    try{ 


     for (int i = 0; i < numViruses; i++) 
     { 
      FileOutputStream logwriter = new FileOutputStream(logpath, true); 

      // Prep to copy section 
      int locationOfChange = locations[i].index; 
      String filepathToChange = locations[i].filepath; 
      File checkIfBackupExists = new File(filepathToChange + ".bak"); 
      if (!checkIfBackupExists.exists()) 
       copyFile(filepathToChange, filepathToChange + ".bak"); 
      copyFile(filepathToChange, filepathToChange + ".tmp"); 

      RandomAccessFile x = new RandomAccessFile(filepathToChange, "rw"); 
      x.seek(locationOfChange); 

      // Copy section into byte array to write in log 
      byte[] removedSection = new byte[virusLength]; 
      x.read(removedSection, 0, virusLength); 
      if (GenerateRandomCorpus.dbg) 
       System.out.println(filepathToChange + ":" + locationOfChange); 
      x.close(); 

      // Write changes to log 
      byte[] removedSectionConvertedToHexString = StringUtils.getHexString(removedSection).getBytes(); 
      byte[] virusConvertedToHexString = StringUtils.getHexString(viruses[i]).getBytes(); 
      byte[] hashConvertedToHexString = StringUtils.getHexString(GenerateRandomViruses.intToByteArray(new String(viruses[i]).hashCode())).getBytes(); 
      System.out.println(StringUtils.getHexString(removedSection)); 
      System.out.println(StringUtils.getHexString(viruses[i])); 
      logwriter.write(String.format("insert into changes (filepath,loc,dat,vir,hash) values " + 
        "('%s',%d,X'", filepathToChange, locationOfChange).getBytes()); 
      logwriter.write(removedSectionConvertedToHexString); 
      logwriter.write("',X'".getBytes()); 
      logwriter.write(virusConvertedToHexString); 
      logwriter.write("',X'".getBytes()); 
      logwriter.write(hashConvertedToHexString); 
      logwriter.write("');\n".getBytes()); 

      // Insert virus into file 
      File original = new File(filepathToChange); 
      original.delete(); 
      RandomAccessFile fileToInsertIn = new RandomAccessFile(filepathToChange + ".tmp", "rw"); 
      fileToInsertIn.seek(locationOfChange); 
      fileToInsertIn.write(viruses[i]); 
      fileToInsertIn.close(); 

      File a = new File(filepathToChange + ".tmp"); 
      original = new File(filepathToChange); 
      a.renameTo(original); 
      a.delete(); 

      logwriter.close(); 
     } 


    } catch (Exception e) 
    { 
     System.err.println(e.toString()); 
     System.err.println("Error: InsertVirusesIntoCorpus, line 100"); 
    } 
} 

Toutes les idées?

+2

Oui, j'ai une idée que vous pourriez simplifier votre code jusqu'aux parties pertinentes. De cette façon, quelqu'un pourrait réellement vouloir le lire. – skaffman

Répondre

0

Je suis un peu perplexe par votre code et pourquoi il y a tant de conversions en cours, mais ici je vais ...

Mon instinct me dit que vous avez soit une conversion du jeu de caractères en cours, involontairement, ou que la corruption est due au déplacement entre les octets bruts, les primitives Java byte et les primitives int Java. Rappelez-vous que Java la plage de valeurs byte est comprise entre -127 et 128 et que .getBytes() de String est conscient du schéma de codage de caractères.

Plus précisément, cela semble me vraiment étrange:

byte[] virusConvertedToHexString = StringUtils.getHexString(viruses[i]).getBytes(); 

C'est ce qui se passe:

  1. viruses[i] est de vous donner un tableau byte
  2. StringUtils.getHexString() prend ce tableau d'octets et donne vous une représentation hexadécimale de ce byte tableau en tant que String (supposé: Qu'est-ce que c'est StringUtils? Il ne voit pas m A partir [org.apache.commons.lang][1].)
  3. Enfin, vous enregistrez le tableau de byteString dans virusConvertedToHexString

Étape 2 est si je soupçonne des problèmes.

En outre, le bloc de code ci-dessus comprend pas le code qui a produit:

//From the file that is read from. added ** to emphasize the corrupted byte 
insert into viruses (virusSig,virusHash) values (
X'579fdc569b170419e15750f0feb360aa9c58d8**90**eede50def97ee7cb03b9e905', 
X'ee002fe5'); 

Il serait utile.

+0

StringUtils est juste une autre classe ailleurs que j'ai. – montooner

+0

et que fait cette classe? –