替换一个字节的数据

问题描述

我试图从文件中只替换一个字节的数据,意思是 0X05 -> 0X15。 我正在使用替换功能来做到这一点。

using (StreamReader reader = new System.IO.StreamReader(Inputfile))
        {
            content = reader.ReadToEnd();
            content = content.Replace("0x05","0x15");
            reader.Close();
        }
        using (FileStream stream = new FileStream(outputfile,FileMode.Create))
        {
            using (BinaryWriter writer = new BinaryWriter(stream,Encoding.UTF8))
            {
                writer.Write(content);
            }
        }

从技术上讲,只有那个字节的数据必须用新字节替换,但我看到有很多字节的数据发生了变化。

为什么其他字节在改变?我怎样才能做到这一点?

解决方法

您在谈论字节,但您已经编写了读取字符串的代码;字符串是对字节的一种解释,所以如果你真的是指字节,那么通过字符串来处理它们是错误的方法

无论如何,如果文件相对较小(可能高达 500mb - 如果比这更大,我会切换到使用增量流读取/更改/写入方法)

>

如果你想改变字节:

var b = File.ReadAllBytes("path");
for(int x = 0; x < b.Length; x++) 
  if(b[x] == 0x5)
    b[x] = (byte)0x15;
File.WriteAllBytes("path",b);

如果您的文件是一个文本文件,里面确实有“0x05”:

File.WriteAllText("path",File.ReadAllText("path").Replace("0x05","0x15"));

为了回应您在评论中的问题,并假设您希望您的文件每包含一个 0x05 就增加 2 个字节(因此,包含三个 0x05 字节的 1000 字节文件在写入后将是 1006 个字节)它是可能最简单:

var b = File.ReadAllBytes("path");

using(FileStream fs = new FileStream("path",FileMode.Create)) //replace file
{
  for(int x = 0; x < b.Length; x++) 
    if(b[x] == 0x5) {
      fs.WriteByte((byte)0x15);
      fs.WriteByte((byte)0x5);
      fs.WriteByte((byte)0x15);
    } else
      fs.WriteByte(b);
}

不要担心一次写入一个字节 - 它在 IO 链的其他地方缓冲。如果你愿意,你可以去寻找一个从数组中写入字节块的解决方案......这更容易编码/理解