2009-07-08 13 views
0

こんにちは。私は1つのSQL形式のファイルを別のものに読み込んでいて、途中の2バイトが壊れています。それは、私がやっていない準備や安全対策だと思います。RandomAccessFile.writeに書き込む内容を書かない

破損したデータの例:

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"); 
    } 
} 

任意のアイデア:/からの読み取りに書き込み

//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'); 

コード?

+2

はい、私はあなたのコードを関連する部分に単純化できると考えています。そうすれば、誰かが実際にそれを読んでみたいかもしれません。 – skaffman

答えて

0

、私の腸は、あなたが起こっていくつかの文字セット変換のいずれかを持っていると言われます...

私はあなたのコードによって当惑ビットだと、なぜ起こっているので、多くの変換がありますが、ここで私は行きます意図せず、または破損が生のバイト、JavaバイトプリミティブおよびJava intプリミティブ間を移動することによるものであることを示します。 Javaのbyteの値の範囲は-127〜128であり、Stringの.getBytes()は文字エンコーディング方式を認識していることに注意してください。

具体的には、これはちょうど私には本当に奇妙に見える:

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

これは何が起こっているかである。

  1. viruses[i]はあなたにbyte配列
  2. StringUtils.getHexString()を与えていること、バイト配列を受け取り、与えあなたはそのbyte配列の16進表現をStringと仮定しています(これは何ですか?StringUtilsは見えません) mは[org.apache.commons.lang][1]からのものである。)
  3. 最後に、あなたがた私はトラブルを疑うだろうさvirusConvertedToHexString

ステップ2にStringbyte配列を格納しています。それが役立つだろう

//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'); 

また、コードブロックは、上記生成されたコードが含まれていません。

+0

StringUtilsは私が持っている別のクラスです。 – montooner

+0

と、このクラスは正確に何をしていますか? –

関連する問題