RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

常用的BIN文件操作總結(jié)

CHANBAEK ? 來源:頭條號(hào)NCG杰哥 ? 作者:頭條號(hào)NCG杰哥 ? 2023-02-28 14:34 ? 次閱讀

BIN文件,即二進(jìn)制文件,廣泛應(yīng)用于嵌入式,我們常用的Firmware通常會(huì)以BIN文件或者HEX文件格式存儲(chǔ),因此,對(duì)BIN文件的讀寫操作其實(shí)還是很普遍的,在這里,我記錄一下我常用到的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即可,如果是要寫B(tài)IN文件,定義BInaryWriter。 讀寫的基本操作為:

讀BIN文件的操作為:bin_read. ReadByte():返回值為讀到的Byte值; bin_read. ReadBytes(count); 返回值為個(gè)數(shù)為count的Byte數(shù)組。 還有很多不同返回格式,int,char等,我這里不一一贅述。

寫B(tài)IN文件的操作為:bin_write. Write(value):其中value就是要寫的值,value可以是byte,int或者char等格式。 bin_write. Write(byte[] buffer, int index, int count); 這個(gè)方法的含義就是將buffer數(shù)組中的一部分值(buffer數(shù)組的開始索引為index,長(zhǎng)度為count),賦值至BIN文件當(dāng)前位置。

下面我舉一個(gè)例子,BIN文件的寫,從0寫到255,256個(gè)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);//創(chuàng)建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文件寫內(nèi)容
                bin_write.Flush();
                bin_write.Close();
                
                file_path.Close();
            }
        }
    }
}

文件運(yùn)行結(jié)果為:

bin文件內(nèi)容

那么寫操作完成了,替換操作要怎么操作呢? 實(shí)際中如果要實(shí)現(xiàn)HEX文件轉(zhuǎn)換為BIN文件,那么替換功能將會(huì)非常有用,比如將其中的某幾個(gè)數(shù)字改動(dòng)一下,見代碼:

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)//打開文件對(duì)話框
            {
                FileStream file_path = new FileStream(save_file.FileName, FileMode.OpenOrCreate,FileAccess.ReadWrite);

                BinaryWriter bin_write = new BinaryWriter(file_path);//創(chuàng)建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文件當(dāng)前位置至第255個(gè)字節(jié)
                bin_write.Write(0x08); //第255個(gè)字節(jié)改為08
                bin_write.Seek(8, SeekOrigin.Begin);//修改BIN文件當(dāng)前位置至第8個(gè)字節(jié)
                bin_write.Write((byte)0x01);//第8個(gè)字節(jié)改為01
                bin_write.Write((byte)0x02);//第9個(gè)字節(jié)改為02
                bin_write.Write((byte)(0x90));//第10個(gè)字節(jié)改為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文件當(dāng)前位置至第128個(gè)字節(jié)
                bin_write.Write(buffer, 2, 5);//將Buffer字節(jié)數(shù)組中的第2到到第7個(gè)數(shù)賦值到BIN文件的第128133個(gè)字節(jié)
                bin_write.Write((byte)(0x90));//第134個(gè)字節(jié)改為08
                Console.WriteLine(file_path.Length);//看一下目前的文件大小
              
                file_path.SetLength(256);//文件大小已經(jīng)超過256,只保留256個(gè)字節(jié)
                Console.WriteLine(file_path.Length);//看一下目前的文件大小
                
                bin_write.Flush();//釋放文件資源
                bin_write.Close();         
                file_path.Close();
            }
        }
    }
}

上述代碼的運(yùn)行結(jié)果為:

可以看到,BIN文件相應(yīng)的位置已經(jīng)更改完成,并且其他位置也沒有出現(xiàn)變動(dòng)。

這里我需要提一下,在做替換過程中,BIN文件的大小是會(huì)發(fā)生變化的,因此我用Console.WriteLine(file_path. Length)來監(jiān)控文件的大小變化。 控制臺(tái)輸出的結(jié)果為:

256,259,256

因此,我在代碼的最后將文件的長(zhǎng)度強(qiáng)行設(shè)置為256.這個(gè)不用擔(dān)心數(shù)據(jù),實(shí)際測(cè)試下來,如果沒有file_path. SetLength(256)語(yǔ)句,那么結(jié)果如下:

可以看到后面幾個(gè)數(shù)據(jù)是無效的數(shù)據(jù),這個(gè)可以直接去掉。

以上是我平時(shí)比較常用的BIN文件操作。 當(dāng)然,BIN文件的某一位的刪除和插入,我還沒有比較容易的辦法,不過BIN文件的刪除或者插入特定字符用的場(chǎng)景非常少,因此沒有過多的研究。 希望以上內(nèi)容對(duì)大家有所幫助。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5082

    文章

    19104

    瀏覽量

    304796
  • 二進(jìn)制
    +關(guān)注

    關(guān)注

    2

    文章

    795

    瀏覽量

    41643
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    565

    瀏覽量

    24727
  • bin
    bin
    +關(guān)注

    關(guān)注

    1

    文章

    33

    瀏覽量

    13368
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    417

    瀏覽量

    25939
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    是什么, 一律分為兩種格式. text 和 binary. 一個(gè)后綴名為.bin文件, 只是想表明它是binary格式.,但并不表明它與某種應(yīng)用程序有必然的聯(lián)系性.比如虛擬光驅(qū)文件常用
    發(fā)表于 01-26 17:57

    轉(zhuǎn)換M34508 TXT文件BIN文件

    轉(zhuǎn)換M34508 TXT文件BIN文件-TXT To BIN For Renesas M34508
    發(fā)表于 12-27 18:32 ?106次下載

    HEX文件BIN文件相互轉(zhuǎn)換的軟件

    HEX文件BIN文件相互轉(zhuǎn)換的軟件:
    發(fā)表于 09-13 15:28 ?380次下載
    HEX<b class='flag-5'>文件</b>和<b class='flag-5'>BIN</b><b class='flag-5'>文件</b>相互轉(zhuǎn)換的軟件

    MDk如何生成bin文件

    介紹了MDk生成bin文件的詳細(xì)過程。
    發(fā)表于 11-02 17:20 ?1次下載

    70v機(jī)數(shù)據(jù)_bin文件

    70機(jī)數(shù)據(jù)指出,bin文件
    發(fā)表于 12-09 23:50 ?0次下載

    bin文件轉(zhuǎn)換為hex文件操作步驟解析

    在做單片機(jī)開發(fā)時(shí),用不同的下載工具,要求下載的固件格式也不一樣,有的要求是HEX文件,有的則要求是BIN文件,如果只有一個(gè)BIN文件如何將它
    發(fā)表于 11-14 09:04 ?7.8w次閱讀
    <b class='flag-5'>bin</b><b class='flag-5'>文件</b>轉(zhuǎn)換為hex<b class='flag-5'>文件</b><b class='flag-5'>操作</b>步驟解析

    MDK -ARM如何生產(chǎn)Bin文件

    MDK-ARM如何生產(chǎn)Bin文件
    的頭像 發(fā)表于 03-14 10:59 ?3353次閱讀
    MDK -ARM如何生產(chǎn)<b class='flag-5'>Bin</b><b class='flag-5'>文件</b>

    cadence操作常用快捷鍵的資料總結(jié)

    本文檔的主要內(nèi)容詳細(xì)介紹的是cadence操作常用快捷鍵的資料總結(jié)。
    發(fā)表于 08-12 08:00 ?0次下載
    cadence<b class='flag-5'>操作</b><b class='flag-5'>常用</b>快捷鍵的資料<b class='flag-5'>總結(jié)</b>

    hex文件bin文件有什么區(qū)別?

    單片機(jī)程序編譯之后,除了生成hex文件之外還生成了bin文件,實(shí)際它們都是單片機(jī)的下載文件。
    的頭像 發(fā)表于 06-15 14:43 ?9700次閱讀
    hex<b class='flag-5'>文件</b>與<b class='flag-5'>bin</b><b class='flag-5'>文件</b>有什么區(qū)別?

    支持Hex、Bin、Motorola S文件的開源庫(kù)使用

    本文為大家分享一個(gè)支持Hex、Bin、Motorola S文件鏡像格式之間進(jìn)行轉(zhuǎn)換的庫(kù):BIN2HS。 概述 BIN2HS是支持Intel Hex、Motorola S格式與
    的頭像 發(fā)表于 08-18 09:39 ?2218次閱讀

    Keil開發(fā)環(huán)境如何生成BIN文件

    作者:王超首發(fā):電子電路開發(fā)學(xué)習(xí)為什么需要BIN文件呢?有些燒錄器只支持BIN文件。進(jìn)行OTA遠(yuǎn)程升級(jí)時(shí),只能使用BIN
    發(fā)表于 01-26 19:29 ?6次下載
    Keil開發(fā)環(huán)境如何生成<b class='flag-5'>BIN</b><b class='flag-5'>文件</b>

    單片機(jī)中的hex和bin文件

    經(jīng)過這幾步后,程序下載工作就完成了,在以上的步驟中我們并沒有選擇要把程序下載到單片機(jī)的哪塊內(nèi)存中,即不需要設(shè)置地址。因?yàn)镠EX文件內(nèi)部的信息已經(jīng)包括了地址。 單片機(jī)一般是下載hex文件。BIN
    的頭像 發(fā)表于 04-18 10:16 ?5646次閱讀

    用于量產(chǎn)燒錄的拼接Bin文件操作

    一般芯片開發(fā)過程中,存在Bin 文件的拼接過程,比如在做IAP 程序+用戶程序過程中,最終燒寫bin 文件或hex 文件需要將兩個(gè)或者三個(gè)單
    發(fā)表于 11-21 15:07 ?5次下載

    淺析HEX和BIN文件

    BIN文件是單純的二進(jìn)制程序文件,內(nèi)部沒有地址信息。如果使用BIN文件燒錄程序時(shí),需要指定下載地址。
    的頭像 發(fā)表于 04-24 17:32 ?5380次閱讀
    淺析HEX和<b class='flag-5'>BIN</b><b class='flag-5'>文件</b>

    keil如何生成bin文件

    Keil是一種集成開發(fā)環(huán)境(IDE),專為ARM架構(gòu)的嵌入式系統(tǒng)開發(fā)而設(shè)計(jì)。在Keil中生成bin文件是將代碼編譯并轉(zhuǎn)換為可執(zhí)行文件的過程。本文將詳細(xì)介紹Keil生成bin
    的頭像 發(fā)表于 12-15 13:43 ?1.2w次閱讀
    RM新时代网站-首页