0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

常用的BIN文件操作总结

CHANBAEK 来源:头条号NCG杰哥 作者:头条号NCG杰哥 2023-02-28 14:34 次阅读

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文件的第128133个字节
                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文件的删除或者插入特定字符用的场景非常少,因此没有过多的研究。 希望以上内容对大家有所帮助。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4983

    文章

    18286

    浏览量

    288506
  • 二进制
    +关注

    关注

    2

    文章

    707

    浏览量

    41250
  • 文件
    +关注

    关注

    1

    文章

    540

    浏览量

    24402
  • bin
    bin
    +关注

    关注

    1

    文章

    33

    浏览量

    13286
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25595
收藏 人收藏

    评论

    相关推荐

    .bin文件怎么打开,.bin是什么文件

    是什么, 一律分为两种格式. text 和 binary. 一个后缀名为.bin文件, 只是想表明它是binary格式.,但并不表明它与某种应用程序有必然的联系性.比如虚拟光驱文件常用
    发表于 01-26 17:57

    转换M34283 HEX文件BIN文件 (HEX To B

    转换M34283 HEX文件BIN文件 -HEX To BIN For Renesas M34283
    发表于 12-27 18:31 43次下载

    转换M34508 TXT文件BIN文件

    转换M34508 TXT文件BIN文件-TXT To BIN For Renesas M34508
    发表于 12-27 18:32 106次下载

    MDk如何生成bin文件

    介绍了MDk生成bin文件的详细过程。
    发表于 11-02 17:20 1次下载

    70v机数据_bin文件

    70机数据指出,bin文件
    发表于 12-09 23:50 0次下载

    bin文件转换为hex文件操作步骤解析

    在做单片机开发时,用不同的下载工具,要求下载的固件格式也不一样,有的要求是HEX文件,有的则要求是BIN文件,如果只有一个BIN文件如何将它
    发表于 11-14 09:04 7.4w次阅读
    <b class='flag-5'>bin</b><b class='flag-5'>文件</b>转换为hex<b class='flag-5'>文件</b><b class='flag-5'>操作</b>步骤解析

    MDK -ARM如何生产Bin文件

    MDK-ARM如何生产Bin文件
    的头像 发表于 03-14 10:59 2880次阅读
    MDK -ARM如何生产<b class='flag-5'>Bin</b><b class='flag-5'>文件</b>

    cadence操作常用快捷键的资料总结

    本文档的主要内容详细介绍的是cadence操作常用快捷键的资料总结
    发表于 08-12 08:00 0次下载
    cadence<b class='flag-5'>操作</b><b class='flag-5'>常用</b>快捷键的资料<b class='flag-5'>总结</b>

    支持Hex、Bin、Motorola S文件的开源库使用

    本文为大家分享一个支持Hex、Bin、Motorola S文件镜像格式之间进行转换的库:BIN2HS。 概述 BIN2HS是支持Intel Hex、Motorola S格式与
    的头像 发表于 08-18 09:39 1738次阅读

    Keil开发环境如何生成BIN文件

    作者:王超首发:电子电路开发学习为什么需要BIN文件呢?有些烧录器只支持BIN文件。进行OTA远程升级时,只能使用BIN
    发表于 01-26 19:29 6次下载
    Keil开发环境如何生成<b class='flag-5'>BIN</b><b class='flag-5'>文件</b>

    单片机中的hex和bin文件

    经过这几步后,程序下载工作就完成了,在以上的步骤中我们并没有选择要把程序下载到单片机的哪块内存中,即不需要设置地址。因为HEX文件内部的信息已经包括了地址。 单片机一般是下载hex文件BIN
    的头像 发表于 04-18 10:16 5084次阅读

    用于量产烧录的拼接Bin文件操作

    一般芯片开发过程中,存在Bin 文件的拼接过程,比如在做IAP 程序+用户程序过程中,最终烧写bin 文件或hex 文件需要将两个或者三个单
    发表于 11-21 15:07 5次下载

    浅析HEX和BIN文件

    BIN文件是单纯的二进制程序文件,内部没有地址信息。如果使用BIN文件烧录程序时,需要指定下载地址。
    的头像 发表于 04-24 17:32 3470次阅读
    浅析HEX和<b class='flag-5'>BIN</b><b class='flag-5'>文件</b>

    bin文件转C语言可以做吗?

    说实话,在我的认知里,bin文件转C语言是不可能的,即便能转,也是那种非常简单的程序,比如:点灯。
    的头像 发表于 08-17 09:04 1223次阅读
    <b class='flag-5'>bin</b><b class='flag-5'>文件</b>转C语言可以做吗?

    keil如何生成bin文件

    Keil是一种集成开发环境(IDE),专为ARM架构的嵌入式系统开发而设计。在Keil中生成bin文件是将代码编译并转换为可执行文件的过程。本文将详细介绍Keil生成bin
    的头像 发表于 12-15 13:43 3278次阅读