替换文件中的字节

问题描述 投票:0回答:3

我正在尝试用其他一些特定字节替换文件中的某些字节,但我的二进制编写器替换太多字节时遇到问题。我的代码有什么问题?

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”。

c# hex binarywriter
3个回答
4
投票

基本上你不想或不需要为此使用

BinaryWriter
。您正在调用
BinaryWriter.Write(int)
,其行为与记录的完全一致。

只需使用

FileStream
写入单个字节:

using (var stream = File.Open(fileName))
{
    stream.Position = 3;
    stream.WriteByte(0x50);
}

更简单,更容易阅读(显然只写了一个字节),并且可以做你想做的事。


1
投票

因为方法

Write
实际上写了
int
(4个字节)。您应该将您的值转换为
byte
类型。
bw.Write((byte)0x50);


0
投票

使用 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
                }
© www.soinside.com 2019 - 2024. All rights reserved.