无法从一个文件中读取十六进制并写入另一个文件

时间:2015-11-05 00:52:44

标签: c# hex

我有一个.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();

我的代码出了什么问题?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

在类似的说明中,BinaryReader也会在ReadByte之后推进流位置。没有必要在每次循环迭代时重置该位置。

答案 1 :(得分:1)

这行代码在完成时自动将流位置提前一个字节:

import weka.core.WekaPackageManager;
...
WekaPackageManager.loadPackages(false);

然后手动增加:

<li id="calendarlink">
  <h4 class="calLink" style="font-weight: bold;">Calendar</h4>
</li>

您正在添加额外的零字节值。