问题描述
我试图从文件中只替换一个字节的数据,意思是 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 链的其他地方缓冲。如果你愿意,你可以去寻找一个从数组中写入字节块的解决方案......这更容易编码/理解