2015-11-05 87 views
2

我有一个包含一些文件的.dat文件。我想读取它的一部分,然后将它写入一个新文件。下面是我的文件看起来像一个十六进制编辑器: Original file从一个文件读取十六进制并写入另一个文件时遇到问题

这是我的新文件的样子: New file

如果你看一下我的第一个文件的第一行,在左边它读取 Do041220B。在我的新文件中,第一行显示D.o.0.4.1.2.2.0.B 出于某种原因,它将00放在所有内容之间。

这里是我的代码:

 OpenFileDialog ofd = new OpenFileDialog();    
     ofd.ShowDialog(); 
     int happyint=0x0; 
     int angryint = 0x1; 
     switch (textBox1.Text) 
     { 

      case "1": 
       happyint = 0x0; 
       angryint = 0x610; 
       break; 
      case "2": 
       happyint = 0x620; 
       angryint = 0xC30; 
       break; 
      case "3": 
       happyint = 0xC40; 
       angryint = 0x1250; 
       break; 
      default: 
       return; 
       break; 
     } 

     BinaryReader br = new BinaryReader(File.OpenRead(ofd.FileName)); 
     BinaryWriter bw = new BinaryWriter(File.Create(Application.StartupPath + "/" + textBox1.Text + "file.dat")); 
     bw.BaseStream.Position = 0x0; 
     for (int i = happyint; i <= angryint; i++) 
     { 
      br.BaseStream.Position = i; 
      bw.Write(br.ReadByte()); 
      bw.BaseStream.Position += 0x1; 
     } 
     bw.Close(); 
     br.Close(); 

这有什么错我的代码?

+0

调试器告诉你什么时候你通过循环? (忽略你在十六进制编辑器右侧看到的内容,并查看左侧的实际十六进制值。比较前四个十六进制值(顶部图像中的“44 6F 30 34”)中的每一个。底部图像中相同的四个值有什么不同? –

回答

4

的问题是,你是手动推进的位置流

// this is wrong!! 
bw.BaseStream.Position += 0x1; 

这是不必要的,因为BinaryWriter.Write(Byte) 将写入字节,推进自身的流位置

在写入之后,手动增加Position将导致位置超出文件的当前长度,并且中间间隔(1个字节)填充0。

在类似的说明中,BinaryReader也提前ReadByte之后的流位置。无需在每次循环迭代中重置该位置。

1

这行代码由一个字节自动前进上完成的流的位置是:

bw.Write(br.ReadByte()); 

当您然后手动增加:

bw.BaseStream.Position += 0x1; 

要添加的额外的零字节值。

相关问题