BIN文件,即二進制文件,廣泛應用于嵌入式,我們常用的Firmware通常會以BIN文件或者HEX文件格式存儲,因此,對BIN文件的讀寫操作其實還是很普遍的,在這里,我記錄一下我常用到的BIN文件操作。
首先C# Winform中有Binary文件(BIN文件)的基本操作類。 如下所示
FileStream file_path = new FileStream(文件名, FileMode,FileAccess);
//BinaryReader bin_read = new BinaryReader(file_path);
BinaryWriter bin_write = new BinaryWriter(file_path);
如上所示,如果是要讀BIN文件,那么直接定義BinaryReader即可,如果是要寫BIN文件,定義BInaryWriter。 讀寫的基本操作為:
讀BIN文件的操作為:bin_read. ReadByte():返回值為讀到的Byte值; bin_read. ReadBytes(count); 返回值為個數為count的Byte數組。 還有很多不同返回格式,int,char等,我這里不一一贅述。
寫BIN文件的操作為:bin_write. Write(value):其中value就是要寫的值,value可以是byte,int或者char等格式。 bin_write. Write(byte[] buffer, int index, int count); 這個方法的含義就是將buffer數組中的一部分值(buffer數組的開始索引為index,長度為count),賦值至BIN文件當前位置。
下面我舉一個例子,BIN文件的寫,從0寫到255,256個byte。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace TEST
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
SaveFileDialog save_file = new SaveFileDialog();
save_file.Filter = "BIN文件|*.bin";
if (save_file.ShowDialog() == DialogResult.OK)
{
FileStream file_path = new FileStream(save_file.FileName, FileMode.OpenOrCreate,FileAccess.ReadWrite);
BinaryWriter bin_write = new BinaryWriter(file_path);//創建BIN文件流
byte[] init_byte = new byte[256];
for (int temp = 0; temp < 256; temp++)
{
init_byte[temp] = (byte)temp;
}
bin_write.Write(init_byte, 0, 256);//給BIN文件寫內容
bin_write.Flush();
bin_write.Close();
file_path.Close();
}
}
}
}
文件運行結果為:
bin文件內容
那么寫操作完成了,替換操作要怎么操作呢? 實際中如果要實現HEX文件轉換為BIN文件,那么替換功能將會非常有用,比如將其中的某幾個數字改動一下,見代碼:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace TEST
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
SaveFileDialog save_file = new SaveFileDialog();
save_file.Filter = "BIN文件|*.bin";
if (save_file.ShowDialog() == DialogResult.OK)//打開文件對話框
{
FileStream file_path = new FileStream(save_file.FileName, FileMode.OpenOrCreate,FileAccess.ReadWrite);
BinaryWriter bin_write = new BinaryWriter(file_path);//創建BIN文件流
byte[] init_byte = new byte[256];
for (int temp = 0; temp < 256; temp++)
{
init_byte[temp] = (byte)temp;
}
bin_write.Write(init_byte, 0, 256);//初始化BIN文件
Console.WriteLine(file_path.Length); //看一下目前文件大小
bin_write.Seek(255, SeekOrigin.Begin);//修改BIN文件當前位置至第255個字節
bin_write.Write(0x08); //第255個字節改為08
bin_write.Seek(8, SeekOrigin.Begin);//修改BIN文件當前位置至第8個字節
bin_write.Write((byte)0x01);//第8個字節改為01
bin_write.Write((byte)0x02);//第9個字節改為02
bin_write.Write((byte)(0x90));//第10個字節改為90
byte[] buffer = new byte[8];
for (int temp = 0; temp < 8; temp++)
{
buffer[temp] = (byte)(temp + 1);
}
bin_write.Seek(128, SeekOrigin.Begin);//修改BIN文件當前位置至第128個字節
bin_write.Write(buffer, 2, 5);//將Buffer字節數組中的第2到到第7個數賦值到BIN文件的第128到133個字節
bin_write.Write((byte)(0x90));//第134個字節改為08
Console.WriteLine(file_path.Length);//看一下目前的文件大小
file_path.SetLength(256);//文件大小已經超過256,只保留256個字節
Console.WriteLine(file_path.Length);//看一下目前的文件大小
bin_write.Flush();//釋放文件資源
bin_write.Close();
file_path.Close();
}
}
}
}
上述代碼的運行結果為:
可以看到,BIN文件相應的位置已經更改完成,并且其他位置也沒有出現變動。
這里我需要提一下,在做替換過程中,BIN文件的大小是會發生變化的,因此我用Console.WriteLine(file_path. Length)來監控文件的大小變化。 控制臺輸出的結果為:
256,259,256
因此,我在代碼的最后將文件的長度強行設置為256.這個不用擔心數據,實際測試下來,如果沒有file_path. SetLength(256)語句,那么結果如下:
可以看到后面幾個數據是無效的數據,這個可以直接去掉。
以上是我平時比較常用的BIN文件操作。 當然,BIN文件的某一位的刪除和插入,我還沒有比較容易的辦法,不過BIN文件的刪除或者插入特定字符用的場景非常少,因此沒有過多的研究。 希望以上內容對大家有所幫助。
-
嵌入式
+關注
關注
5072文章
19026瀏覽量
303516 -
二進制
+關注
關注
2文章
794瀏覽量
41602 -
文件
+關注
關注
1文章
561瀏覽量
24703 -
bin
+關注
關注
1文章
33瀏覽量
13361 -
數組
+關注
關注
1文章
416瀏覽量
25913
發布評論請先 登錄
相關推薦
評論