我正在尝试用其他一些特定字节替换文件中的某些字节,但我的二进制编写器替换太多字节时遇到问题。我的代码有什么问题?
using (BinaryWriter bw =
new BinaryWriter(File.Open(fileName,
FileMode.Open)))
{
bw.BaseStream.Position = 0x3;
bw.Write(0x50);
}
本应将字母“E”(十六进制 0x45)更改为字母“P”,但实际上更改了该字节和另外 3 个字节;从“45 30 31 FF”到“50 00 00 00”。我想保留“30 31 FF”,只需将“45”更改为“50”。
基本上你不想或不需要为此使用
BinaryWriter
。您正在调用 BinaryWriter.Write(int)
,其行为与记录的完全一致。
只需使用
FileStream
写入单个字节:
using (var stream = File.Open(fileName))
{
stream.Position = 3;
stream.WriteByte(0x50);
}
更简单,更容易阅读(显然只写了一个字节),并且可以做你想做的事。
因为方法
Write
实际上写了int
(4个字节)。您应该将您的值转换为 byte
类型。 bw.Write((byte)0x50);
使用 Seek 方法移动文件流对象的当前位置。您可以根据需要指定流编写器相对于文件开头或结尾的位置。 以下是示例代码。
string filepath = @"C:\MyDirectory\MyFile.tif";
using (System.IO.FileStream fs = System.IO.File.Open(filepath, FileMode.Open)) // Open the file for modification. Does not create a new file.
{
long offset = 43; // Set the offset value to 43; This number represents the number of the bytes the stream writer has to move before writing the bytes to the file
byte[] bytes = new byte[10]; // create an array of bytes that has to be written at offset 43 in the file
fs.Seek(offset, SeekOrigin.Begin); // set the current position of stream to offset 43 relative to the beginning of the file
fs.Write(bytes); // substitute bytes inside the file.
fs.Flush(); // write bytes in the filestream buffer to the disk
fs.Close(); // close the file stream
}