精华内容
下载资源
问答
  • C#读取BIN文件内容

    2018-08-23 11:54:14
    C#读取BIN文件内容,获取其中数据并显示。用于对BIN文件的操作。
  • txt文件转换为bin文件

    2019-01-09 10:36:31
    txt文档转换为bin文件,支持16进制,windows工具,简单好用
  • TXT文本转成BIN文件

    2019-01-09 13:34:11
    TXT文本转成BIN文件,不管内容是什么,只要是TXT格式的都可以转成BIN文件
  • 因为前几天用到BIN转为TXT,苦于没有合适工具,自己写了一个,送给有用的朋友吧
  • BIN文件修改,比较编辑器,亲测 好用,快速对比两个bin文件不同点
  • bin文件对比工具

    2017-03-11 16:03:35
    快速对比两个bin文件不同点
  • BIN文件查看器

    热门讨论 2014-09-10 21:44:56
    BIN文件查看器 可以查看BIN文件,将其换转为TXT文档
  • vc读取bin文件

    热门讨论 2014-08-04 18:19:09
    读取bin文件 mfc工程文件 可直接运行
  • C# 读取 bin 文件

    热门讨论 2014-06-26 15:35:05
    版本:VS2010 C#读取bin文件,并显示在TextBox控件内
  • bin文件编辑器

    2014-04-26 00:56:48
    很好的DELL,bin文件编辑器 适用于大多数路由器 交换机BIN文件编辑
  • BIN文件切割器

    热门讨论 2012-11-21 10:45:21
    可以将大的BIN文件切割成若干个小的BIN文件
  • python bin文件处理

    万次阅读 多人点赞 2019-07-11 23:36:11
    文章目录python bin文件处理小记软件准备bin文件读取bin文件写入bin文件的大小端写入bin文件的写0bin文件的写1bin文件的合并bin文件写入字符串 软件准备 python 版本 Python 3.7.1 大概花费时间:3天半抽空学习的...

    在下这厢有礼了

    0. 软件准备

    python 版本 Python 3.7.1
    大概花费时间:3天半抽空学习的知识分享

    bin文件查看器:https://pan.baidu.com/s/1_XebNTlh052zt5Xa58xDMQ 提取码:f4uj

    生bin的工具我就不提供了,你自己找找吧!

    1. 基础知识掌握

    bin文件: open函数创建file对象

    打开文件的不同模式:例子:open(“file.txt”,‘r’)

    模式描述
    r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
    r+打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
    w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    w+打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb+以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
    t文本默认
    x写模式,新建一个文件,如果该文件存在,则会报错。
    b二进制模式
    +打开一个文件进行更新(可读可写)。

    bin文件的python struct库 读写属性

    a = struct.pack('B',0x00) 
    b = struct.unpack(‘B’,a)
    这块可以使用python编译的看一下哦!(你就明白了)
    
     1. struct.pack用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型,
     可以把这里的字符串理解为字节流,或字节数组)。其函数原型为:struct.pack(fmt, v1, v2, ...),
     参数fmt是格式字符串,关于格式字符串的相关信息在下面有所介绍。v1, v2, ...表示要转换的python值。
    
     2. struct.unpack做的工作刚好与struct.pack相反,用于将字节流转换成python数据类型。它的
     函数原型为:struct.unpack(fmt, string),该函数返回一个元组
    
    FormatC TypePython字节数
    xpad byteno value1
    ccharstring of length 11
    bsigned charinteger1
    Bunsigned charinteger1
    ?_Boolbool1
    hshortinteger2
    Hunsigned shortinteger2
    iintinteger4
    Iunsigned intinteger or long4
    llonginteger4
    Lunsigned longlong4
    qlong longlong8
    Qunsigned long longlong8
    ffloatfloat4
    ddoublefloat8
    schar[]string1
    pchar[]string1
    Pvoid *long

    这快就类似于C语言中的字节对齐,大小端的选择

    例子:(后面有说明)
    a = struct.pack('<I',0x12345678)  #四字节存入,按小端存储
    b = struct.pack('>I',0x12345678)  #四字节存入,按大端存储
    
    CharacterByte orderSize and alignment
    @nativenative 凑够4个字节
    =nativestandard 按原字节数
    <little-endianstandard 按原字节数
    >big-endianstandard 按原字节数
    !network (= big-endian)standard 按原字节数

    2. bin文件的打开和模式

    file = open(file_name,'wb')#二进制写模式
    file = open(file_name,'rb')#二进制读模式
    file = open(file_name,'ab')#二进制补充读写模式
    
    

    3. bin文件读取

    import struct
    import os
    
    def ReadFile():
        filepath='7.bin'
        binfile = open(filepath, 'rb') #打开二进制文件
        size = os.path.getsize(filepath) #获得文件大小
        for i in range(size):
            data = binfile.read(1) #每次输出一个字节
            print(data)
        binfile.close()
    if __name__ == '__main__':
    	ReadFile()
    

    7.bin文件如下
    在这里插入图片描述
    效果图
    在这里插入图片描述

    4. bin文件写入

    import struct
    import os
    
    def WriteFile():
        filepath='7.bin'
        data = 123
        binfile = open(filepath, 'ab+') #打开二进制文件(追加完成)
        a = struct.pack('B',data)
        binfile.write(a)
        binfile.close()
    if __name__ == '__main__':
    	WriteFile()
    

    7.bin文件
    在这里插入图片描述
    效果图
    在这里插入图片描述

    5. bin文件的大小端写入

    import struct
    
    file_name = "5.bin"
    def Big_little_endian():
        file = open(file_name,'wb')
        a = struct.pack('I',0x12345678)  #四字节存入,正常状态
        b = struct.pack('<I',0x12345678)  #四字节存入,按小端存储
        c = struct.pack('>I',0x12345678)  #四字节存入,按大端存储
        file.write(a)
        file.write(b)
        file.write(c)
        file.close()
       
    if __name__ == '__main__':
        Big_little_endian()
    

    效果图

    在这里插入图片描述

    6. bin文件的写0

    import struct
    
    bin_file_1 = "1.bin"
    
    def write0x00():
        file = open(bin_file_1,'wb')
        for i in range(1,0xFF):   
            data = struct.pack('B',0x00)  #写0
            file.write(data)
        file.close
    
    if __name__ == '__main__':
        write0x00()
    

    效果图:

    在这里插入图片描述

    7. bin文件的写1

    import struct
    
    bin_file_2 = "2.bin"
    
    def write0xFF():
        file = open(bin_file_2,'wb')
        for i in range(0,0xFF):   
            data = struct.pack('B',0xFF)  #写1
            file.write(data)
        file.close
    
    if __name__ == '__main__':
        write0x00()
    

    效果图:
    在这里插入图片描述

    8. bin文件的合并

    1.bin和2.bin合并成merage.bin

    import struct
    
    bin_file_1 = "1.bin"
    bin_file_2 = "2.bin"
    bin_file_merage = "merage.bin"
    
    def merage_bin():
        file_merage = open(bin_file_merage,'wb')
        file_1 = open(bin_file_1,'rb')
        data = file_1.read()
        file_merage.write(data)    
        file_2 = open(bin_file_2,'rb')
        data = file_2.read()
        file_merage.write(data)
        file_1.close()
        file_2.close()
        file_merage.close()
        
    if __name__ == '__main__':
        merage_bin()
    

    效果图:
    在这里插入图片描述

    9. bin文件写入字符串

    import struct
    import string
    
    bin_file_1 = "7.bin"
    
    enter = memoryview(b"STARTX") #返回值是元组
    
    def writeString():
        file = open(bin_file_1,'wb')
        for i in enter:
            data = struct.pack('B',i)
            file.write(data)
        file.close
    
    if __name__ == '__main__':
        writeString()
    

    效果图:

    在这里插入图片描述

    学习:

    1. https://blog.csdn.net/and_then111/article/details/86744938
    2. python手册
    展开全文
  • BIN文件修改器

    热门讨论 2012-12-07 01:02:00
    BIN文件修改器 一款修改墨香BIN文件的软件·
  • 路由器备份config.bin文件密码查看器

    热门讨论 2014-10-09 20:24:59
    从路由器备份config.bin文件里查看并找回宽带密码
  • S19转BIN文件工具

    热门讨论 2013-09-09 09:29:55
    从flash中读取的是S19格式的文件转换为bin 的工具。
  • Elf文件转BIN文件工具

    热门讨论 2013-06-16 11:03:11
    把Elf文件转换成BIN文件的工具。ielftool.exe
  • .bin文件的反汇编记录

    千次阅读 2020-08-26 11:30:32
    前言 原本打算把IDA的使用与技巧写完,发现其实网上也有很多,这...bin文件是二进制文件,是文件格式binary的缩写,后缀名为".bin"的文件,表式它是binary格式。通常来说,它的内容是机器代码,汇编语言编译后的结果。

    前言

    原本打算把IDA的使用与技巧写完,发现其实网上也有很多,这就以后再议吧(主要还是懒+拖延症吧…)
    工作需要接触的逆向,从开始到现在做的一直是elf格式文件,也不需要脱壳,感觉也比较简单。
    工作常见
    前两天朋友托帮忙看一个.bin,发现自己现在掌握的其实仅仅冰山一角。将此次工作记录,便于日后学习查阅。

    一、 一些相关知识点

    asm、bin、hex、elf文件

    asm是汇编语言源程序的扩展名,.asm文件是以asm作为扩展名的文件,是汇编语言的源程序文件。汇编语言(Assembly Language)是面向机器的程序设计语言,是利用计算机所有硬件特性并能直接控制硬件的语言。在汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。

    bin文件是二进制文件,是文件格式binary的缩写,后缀名为".bin"的文件,表式它是binary格式。通常来说,它的内容是机器代码,汇编语言编译后的结果。

    hex全称baiIntel HEX,是可以烧写到单片机中,被单片机执行的一种文件格式。通常用于传输将被存于ROM或者EPROM中的程序和数据。是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。大多数EPROM编程器或模拟器使用Intel HEX文件,其记录由对应机器语言码和/或常量数据的十六进制编码数字组成。

    elf是Linux的主要可执行文件格式。 elf文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等。

    有段时间研究了一下elf文件格式,做了很多笔记,有时间再更新上来。

    #bin、elf的一些要点:

    1.执行raw bin只需要将程序加载到其起始地址,即可执行; 执行elf程序则需要一个ELF Loader。uboot和Linux kernel启动时没有ELF Loader,所以烧在flash上的文件只能是raw bin,即镜像文件image。

    2.gcc编译出来的是elf文件,objcpy将elf文件转换为bin文件。

    我用了两种方法反汇编.bin文件。

    a)bin文件转换为hex文件,IDA打开hex文件
    
    b)使用交叉编译工具链进行bin的反汇编
    arm-linux-objdump -D -b binary -m arm xxx.bin > xxx.asm
    

    二、两种实现方法

    方法一

    首先利用bin转hex工具,将bin文件转换成hex文件,类似的工具网上能找到,百度一下。
    转换完毕,使用IDA打开hex文件,这里我用的是IDA Pro7.2
    下面是IDA的步骤:
    IDA打开hex文件进入如下界面
    在这里插入图片描述
    Processor type 选择 ARM Little-endian,而后
    在这里插入图片描述
    点开Processor options,再点开Edit ARM architecture options,选择ARMv7-M,然后一路ok。
    此时出现的是数据表现型式
    在这里插入图片描述
    用快捷键c可转成汇编代码,在地址等地方(画红线处)键c即可
    在这里插入图片描述
    汇编代码
    在这里插入图片描述

    方法二

    利用交叉编译工具链arm-linux 的arm-linux-objdump进行反汇编。

    objdump是Linux下的反汇编目标文件或者可执行文件的命令,arm-linux-objdump与之参数相同。
    常见用法:
    1.-b 文件格式 指定目标码格式
    2.-d 反编译可执行段
    3.-D 反编译所有段
    4.-EB,-EL指定字节序
    5.-f 显示文件的整体头部摘要信息
    6.-h 显示目标文件中各个段的头部摘要信息
    7.-I 显示支持的目标文件格式和CPU架构
    8.-j name显示指定section 的信息
    9.-m 主机类型 指定反汇编目标文件时使用的架构

    将elf或bin文件反编译到xx文件:

    arm-linux-objdump –D elf_file > dis_file 
    
    arm-linux-objdump –D –b binary –m arm bin_file > dis_file
    
    参数:
    
    -D 反编译所有代码
    
    -m 主机类型, arm
    
    -b 文件格式, binary
    
    如:
    arm-linux-objdump -D -b binary -m arm xxx.bin > xxx.asm
    把xxx.bin反汇编到xxx.asm文件
    

    下载安装arm-linux-gcc

    我的是arm-linux-gcc-4.6.4-x86_64.tar.bz2。
    arm-linux-gcc安装包

    说一下安装。
    cp arm-linux-gcc-4.6.4-x86_64.tar.bz2 到 /usr/local
    解压
    tar -jxvf arm-linux-gcc-4.6.4-x86_64.tar.bz2

    解压完后可以看到 /usr/local 下有个 opt 文件夹
    在 opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/bin 下可以看到交叉编译器的工具。

    neko@neko:/usr/local$ ls
    arm-linux-gcc-4.6.4-x86_64.tar.bz2  bin  etc  games  include  lib  man  opt  sbin  share  src
    neko@neko:/usr/local$ ls opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/bin/
    arm-arm1176jzfssf-linux-gnueabi-addr2line     arm-linux-addr2line     arm-none-linux-gnueabi-addr2line
    arm-arm1176jzfssf-linux-gnueabi-ar            arm-linux-ar            arm-none-linux-gnueabi-ar
    arm-arm1176jzfssf-linux-gnueabi-as            arm-linux-as            arm-none-linux-gnueabi-as
    arm-arm1176jzfssf-linux-gnueabi-c++           arm-linux-c++           arm-none-linux-gnueabi-c++
    arm-arm1176jzfssf-linux-gnueabi-cc            arm-linux-cc            arm-none-linux-gnueabi-cc
    arm-arm1176jzfssf-linux-gnueabi-c++filt       arm-linux-c++filt       arm-none-linux-gnueabi-c++filt
    arm-arm1176jzfssf-linux-gnueabi-cpp           arm-linux-cpp           arm-none-linux-gnueabi-cpp
    arm-arm1176jzfssf-linux-gnueabi-ct-ng.config  arm-linux-ct-ng.config  arm-none-linux-gnueabi-ct-ng.config
    arm-arm1176jzfssf-linux-gnueabi-elfedit       arm-linux-elfedit       arm-none-linux-gnueabi-elfedit
    arm-arm1176jzfssf-linux-gnueabi-g++           arm-linux-g++           arm-none-linux-gnueabi-g++
    arm-arm1176jzfssf-linux-gnueabi-gcc           arm-linux-gcc           arm-none-linux-gnueabi-gcc
    arm-arm1176jzfssf-linux-gnueabi-gcc-4.6.4     arm-linux-gcc-4.6.4     arm-none-linux-gnueabi-gcc-4.6.4
    arm-arm1176jzfssf-linux-gnueabi-gcov          arm-linux-gcov          arm-none-linux-gnueabi-gcov
    arm-arm1176jzfssf-linux-gnueabi-gprof         arm-linux-gprof         arm-none-linux-gnueabi-gprof
    arm-arm1176jzfssf-linux-gnueabi-ld            arm-linux-ld            arm-none-linux-gnueabi-ld
    arm-arm1176jzfssf-linux-gnueabi-ld.bfd        arm-linux-ld.bfd        arm-none-linux-gnueabi-ld.bfd
    arm-arm1176jzfssf-linux-gnueabi-ldd           arm-linux-ldd           arm-none-linux-gnueabi-ldd
    arm-arm1176jzfssf-linux-gnueabi-nm            arm-linux-nm            arm-none-linux-gnueabi-nm
    arm-arm1176jzfssf-linux-gnueabi-objcopy       arm-linux-objcopy       arm-none-linux-gnueabi-objcopy
    arm-arm1176jzfssf-linux-gnueabi-objdump       arm-linux-objdump       arm-none-linux-gnueabi-objdump
    arm-arm1176jzfssf-linux-gnueabi-populate      arm-linux-populate      arm-none-linux-gnueabi-populate
    arm-arm1176jzfssf-linux-gnueabi-ranlib        arm-linux-ranlib        arm-none-linux-gnueabi-ranlib
    arm-arm1176jzfssf-linux-gnueabi-readelf       arm-linux-readelf       arm-none-linux-gnueabi-readelf
    arm-arm1176jzfssf-linux-gnueabi-size          arm-linux-size          arm-none-linux-gnueabi-size
    arm-arm1176jzfssf-linux-gnueabi-strings       arm-linux-strings       arm-none-linux-gnueabi-strings
    arm-arm1176jzfssf-linux-gnueabi-strip         arm-linux-strip         arm-none-linux-gnueabi-strip
    neko@neko:/usr/local$ 
    

    接下来就是添加环境变量了

    vi etc/profile
    

    打开profile文件,在最底下添加工具链的bin路径

    export PATH=$PATH:/usr/local/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/bin
    

    在这里插入图片描述
    保存退出后 source /etc/profile 使之生效。
    除了/etc/profile,我在 ~/.bashrc 的最后一行也加上了

    export PATH=/usr/local/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/bin:${PATH}
    

    保存退出后依旧 source ~/.bashrc
    配置好环境变量后,arm-linux-gcc -v 查看

    neko@neko:/usr/local$ arm-linux-gcc -v
    Using built-in specs.
    COLLECT_GCC=arm-linux-gcc
    COLLECT_LTO_WRAPPER=/usr/local/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/bin/../libexec/gcc/arm-arm1176jzfssf-linux-gnueabi/4.6.4/lto-wrapper
    Target: arm-arm1176jzfssf-linux-gnueabi
    Configured with: /work/builddir/src/gcc-4.6.4/configure --build=x86_64-build_unknown-linux-gnu --host=x86_64-build_unknown-linux-gnu --target=arm-arm1176jzfssf-linux-gnueabi --prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4 --with-sysroot=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot --enable-languages=c,c++ --with-arch=armv6zk --with-cpu=arm1176jzf-s --with-tune=arm1176jzf-s --with-fpu=vfp --with-float=softfp --with-pkgversion='crosstool-NG hg+unknown-20130521.154019 - tc0002' --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --with-gmp=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-mpfr=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-mpc=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-ppl=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-cloog=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-libelf=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-target-optspace --without-long-double-128 --disable-nls --disable-multilib --with-local-prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot --enable-c99 --enable-long-long
    Thread model: posix
    gcc version 4.6.4 (crosstool-NG hg+unknown-20130521.154019 - tc0002) 
    

    安装完成。

    使用arm-linux-objdump进行反汇编

    neko@neko:~/test$ arm-linux-objdump -D -b binary -m arm test.BIN > test.asm
    neko@neko:~/test$ ls
    test.asm  test.BIN
    neko@neko:~/test$ vi test.asm
    

    在这里插入图片描述
    这也是我第一次反汇编.bin文件,对比一下IDA与objdump,觉得IDA做elf格式的文件优势明显,二进制文件用objdump看感觉更舒服一点(仅个人看法)。可能也是朋友给的这个文件不全,所以IDA出来也不连贯吧。。。

    汇编分析就不写了,我比较啰嗦,写个小东西都能写出来长篇大论。以后有时间总结好了再记录吧。
    汇编指令太多,附一个arm指令集中文手册chm版,方便查阅。
    arm指令集中文手册chm版

    人非圣贤,我仍菜鸡,有错误的地方还望各位大佬们指出,多多指教。
    共勉~

    展开全文
  • bin文件转txt工具

    热门讨论 2011-12-14 11:21:36
    该工具可以将bin文件转为txt文件,很好用!
  • bin文件查看修改器

    千次下载 热门讨论 2012-05-18 18:02:29
    网络上看到了的一bin文件修改查看器,用于查看和修改BIOSS信息及其它BIN文件
  • 目录 1.hex文件分析 2.hex文件和bin文件的区别 3.基于qt开发hex转bin工具 前言:很多MCU代码编译器都会生成hex文件,hex文件的...当然,也可以先把hex转换成bin文件,再放进U盘给MCU自举升级,这样MCU从bin里...

    目录

    1.hex文件分析

    2.hex文件和bin文件的区别

    3.基于qt开发hex转bin工具


    前言:很多MCU代码编译器都会生成hex文件,hex文件的用途很多。有些直接把它放进U盘,然后给MCU自举升级,在MCU读取hex文件的时候需要将hex里的数据转换之后才能写到自身的flash里,给自身升级。当然,也可以先把hex转换成bin文件,再放进U盘给MCU自举升级,这样MCU从bin里读到的数据可以直接写到flash里,从而提高大大提高升级速度。

    1.hex文件分析

    下面截取从hex文件截图了几行:


            第一行:02000040800F2  即: 0x02 0x00 0x00 0x04 0x08 0x00 0xF2,都是一个个的十六进制数。一行数据中不同的颜色代表不同的信息域:

    以上面的数据行格式分析下面一行:

           各个域的信息分别为: 

                         数据长度:0x01
                         数据地址:0x0000
                         数据类型:0x00
                         数据:0807002001010008CB020008C3020008
                         校验值:0x15

    其中,数据类型有以下几类:

    00:数据记录
    01:文件结束记录
    02:扩展段地址记录
    03:开始段地址记录
    04:扩展线性地址记录
    05:开始线性地址记录

    扩展段地址记录和扩展线性地址记录是用来干什么的呢?

    行格式里的数据地址用两个字节保存,最大值0xFFFF,只能表示64k;一般很多的MCU里的flash都超过64k,为了保存高地址的数据,就有了扩展段地址扩展线性地址

    当读取这行的数据类型是0x04(扩展线性地址)时,那么,这行的数据就是随后数据的基地址。例如:

    第一行的数据类型是0x04(扩展线性地址),它的数据0x0800,就是第二行数据的基地址。第二行的数据类型是0x00(数据记录),它的地址是0x0000,那么它的数据0807002001010008CB020008C3020008要写入flash的地址为(0x0800<<16)|0x0000 ,也就是写入flash的0x0800 0000这个地址。第三行的数据的写入地址为0x0800 0010,该基地址保留到下一个扩展记录为止。

    当读取这行的数据类型是0x02(扩展段地址)时,例如:

    第一行的数据类型是0x02(扩展段地址) ,它的数据是0x1200;那么,第二行的数据00000000472105014B21050100000000要写flash的地址为(0x1200<<2)+0x2460,也就是写入flash的0x0001 4460这个地址第三行也是以0x1200为基地址,同样的计算出真正写入的地址。

    如果用Notepad+编辑器打开hex文件,它会把不同的数据域标记不同的颜色,而且,如果最后的校验值是的对话,标注为绿色,若校验值错误,标注为黄色。

    到此,我们已经大概知道怎么解读hex文件了。下面可以开始尝试把它应用起来。

    2.hex文件和bin文件的区别

    第一点:

    hex文件和bin文件都是进行MCU开发时生成的烧录文件,hex文件是携带了数据和其数据对应在MCU flash存放的地址;bin文件纯属数据,那么怎么知道它的数据该怎么保存在flash里呢?bin里的数据是没有地址,但是它的数据时连续的,只要确定数据的写入起始地址,那么所有数据就在这个起始地址开始递增写入就行了。当我们用上位机Flash Loader Demo烧录芯片,用的烧录文件就是bin文件,烧录的时候是要先配置flash起始烧录的地址。

    第二点:

    hex文件的数据需要经过转换才能写入flash,这个转换过程可以发生在烧录器里、烧录的上位机里或者是MCU自举升级时先转换在写flash。bin文件数据可以直接复制到相应的flash位置上,不需要再经过任何处理。

    第三点:

    同一个工程编译出来的hex文件肯定比bin文件大,所以bin文件具有节省内存、便于传输的优点。为什么hex文件会比bin文件大呢?看下面例子:

    char hex[9] = "12487936";//占用9字节
    char bin[4]={0x12,0x48,0x79,0x36};//只占用4字节

    hex文件里的数据时可以打印显示出来的,而bin文件是二进制数据。 

    接下来我们尝试怎么把hex文件转换成bin文件。

    3.基于qt开发hex转bin工具

    如果用keil工具进行编译,keil提供了直接生成bin文件的插件,在配置里加入:

    这样就能直接生成bin文件,文件名为UPDATA.bin。而接下来要做的是,基于qt自己编写一个exe程序,通过读入hex文件转换生成bin文件。

    1.新建一个Qt控制台应用:

    2.先看main函数:

    #include <QCoreApplication>
    #include <QDebug>
    #include <QFile>
    #include <stdlib.h>
    #include <QByteArray>
    #include <QDataStream>
    
    
    typedef struct{
        unsigned char datalen;//数据字节
        unsigned short addr;//地址域
        unsigned char datatype;//类型
        unsigned char databuf[16];//数据记录
        unsigned char checkout;//校验和
    }HexFormatForLine ;
    
    bool ReadHexLineData(HexFormatForLine* out,const QByteArray & ba);//false: 校验错误 true:校验成功
    char HexToBin(HexFormatForLine* ba,QDataStream & out);//return 0: ok  1:hex文件结束 2:hex文件有误
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        QString filepath=QString(argv[1]);//获取hex文件路径
        QFile hexfile(filepath);
        QFile outfile;
    
        outfile.setFileName(QString(argv[2]));//获取bin文件的保存路径
        if(outfile.open(QIODevice::WriteOnly)==false){
            qDebug("创建bin文件失败!");
             a.exit(0);
        }
        QDataStream out(&outfile);
    
        if(hexfile.open(QIODevice::ReadOnly)==false){
            qDebug("打开hex文件失败!");
            outfile.close();
             a.exit(0);
        }
        
        QByteArray alinedata;
        HexFormatForLine HexDataStr;
        while(!hexfile.atEnd()){//循环处理,至hex文件读完
            /*若: alinedata =QByteArray::fromHex(":12345678");
              则: alinedara ={0x12,0x23,0x45,0x78};*/
            alinedata = QByteArray::fromHex(hexfile.readLine());//从hex文件中读取一行
            bool ret = ReadHexLineData(&HexDataStr,alinedata);//将一行数据解读到HexDataStr结构体
            if(!ret){
                qDebug("校验出错,hex文件有误.");
                outfile.remove();//删除输出的bin文件
                hexfile.close();//关闭输入文件
                 a.exit(0);
            }
            ret=HexToBin(&HexDataStr,out);//将解读后的数据写入bin文件
            if(ret!=0){
                break;
            }
        }
    
        qDebug() <<"hex2bin ok.";
        hexfile.close();
        outfile.close();
        a.exit(0);
    }

    编程要点: 

    • 通过argv参数获取hex文件的路径和配置bin文件的保存路径
    • QFile文件读写操作
    • 利用fromHex函数将hex里的字符串转换成16进制编码的数组。
    • 在while循环里,每一次循环读取hex文件的一行数据进行处理,ReadHexLineData函数将一行数据里的每一个域解析并保存在HexDataStr结构体里面。 然后将该结构体传入HexToBin函数处理。

    3.下面提供ReadHexLineData和HexToBin函数:

    bool ReadHexLineData(HexFormatForLine* out,const QByteArray & ba)//false: 校验错误 true:校验成功
    {
         unsigned char i,checkoutCal=0;
    
        //计算校验值
         for(i=0;i < ba.size()-1;i++){
            checkoutCal += (unsigned char)ba.at(i);
         }
         checkoutCal = 0x100-checkoutCal;
         //获取个部分域的值
         out->datalen =(unsigned char)ba.at(0);
         out->addr = ((unsigned char)ba.at(1)<<8)|(unsigned char)ba.at(2);
         out->datatype = (unsigned char)ba.at(3);
         memset(out->databuf,0,sizeof(out->databuf));
         for(i = 0;i<out->datalen;i++){
            out->databuf[i] = (unsigned char)ba.at(4+i);
         }
         out->checkout = (unsigned char)ba.at(4+i);
    #if  0 //调试时打开
         qDebug("datalen=%X",out->datalen);
         qDebug("addr=%X",out->addr);
         qDebug("datatype=%X",out->datatype);
         qDebug("checkout=%X",out->checkout);
         qDebug("checkoutCal=%X",checkoutCal);
    #endif
        //比较读取的校验值和计算的校验值是否一致
        if(checkoutCal == out->checkout){
            return true;
        }
        return false;
    }
    
    char HexToBin(HexFormatForLine* ba,QDataStream & out)//return 0: ok  1:hex文件结束 2:hex文件有误
    {
        static unsigned int ExStageAddr = 0x00;//扩展段地址
        static unsigned int ExLineAddr = 0x00;//扩展线性地址
        static unsigned int absoluteAddrLocal = 0x00;//本地记录绝对地址
        unsigned int absoluteAddrCurrent = 0x00;//计算当前记录的绝对地址
        unsigned int Bytesskipped = 0;//被跳过的字节数
    
        switch(ba->datatype){
            case 0x00://数据记录
                //计算出当前记录的绝对地址
                if(ExStageAddr != 0){
                    absoluteAddrCurrent = (ba->addr+ExStageAddr);
                }else if(ExLineAddr != 0){
                    absoluteAddrCurrent = (ba->addr|ExLineAddr);
                }else{
                    absoluteAddrCurrent = ba->addr;
                }
                //hex文件第一条数据记录时,将本地绝对地址absoluteAddrLocal同步等于当前记录的绝对地址absoluteAddrCurrent
                if(absoluteAddrLocal == 0){
                        absoluteAddrLocal = absoluteAddrCurrent;
                }
                Bytesskipped = absoluteAddrCurrent-absoluteAddrLocal;//比较当前记录的绝对地址absoluteAddrCurrent和本地的绝对地址absoluteAddrLocal是否有偏差
            break;
            case 0x01://文件结束记录
                return 1;
            break;
            case 0x02://扩展段地址记录
                ExStageAddr = (ba->databuf[0]<<8|ba->databuf[1])<<2;
                ExLineAddr = 0x00;
                return 0;//return ok
            break;
            case 0x04://扩展线性地址记录
                ExLineAddr = (ba->databuf[0]<<8|ba->databuf[1])<<16;
                ExStageAddr = 0x00;
                return 0;//return ok
            break;
            default:
                return 2;
            break;
        }
    
        for(unsigned int i = 0;i < Bytesskipped;i++){//被跳过的地址,填充0
            out <<(unsigned char)0x00;
        }
        if(Bytesskipped!=0){
            qDebug() <<Bytesskipped;
        }
        absoluteAddrLocal += Bytesskipped;//本地绝对地址absoluteAddrLocal累加
    
        for(unsigned int i = 0;i < ba->datalen;i++){
            out <<ba->databuf[i];
        }
        absoluteAddrLocal += ba->datalen;//本地绝对地址absoluteAddrLocal累加
    
        return 0;//return ok
    }

    将上面两块代码复制在工程,选择Release,点击build,编译出exe程序。这里不能点击run,因为点击run默认不会写argv参数。我们需要argv参数提供hex文件路径和bin文件的保存路径(这里可以在代码里加入一个默认路径,这样,若argv为空则使用默认路径)。

    4.将生成的exe文件复制到单独的文件夹:

    在电脑左下角搜索qt,找到Qt 5.4 for Desktop (MinGW 4.9 32 bit) 工具,点击打开,切换到刚才保存exe文件的目录,输入windeployqt hex2bin.exe,这个就可以把exe需要的库文件复制到exe保存路径下:

    红框里的文件可以删除来节约空间:

    5.接下来把需要转换的hex文件也放进这个文件夹,同时增加了run_hex2bin.bat文件,这个是为了调用hex2bin.exe,bat里面的内容是:

    hex2bin.exe  ./UPDATA.hex ./UPDATA.bin

     点击run_hex2bin.bat,就会运行hex2bin.exe文件,然后生成的bin文件就会保存在该目录下。

    6.前面提到过用keil自带的插件可以生成bin文件,那么现在可以在keil工程配置那里,after build之后凋用我们自己做的hex2bin.exe来将hex文件转换成bin文件。当然前提要把hex2bin.exe文件及其需要的dll文件全部复制到keil工程文件uvproj所在的目录下。再进行如下配置:

    将keil工程编译一次,在对比用fromelf和自己做的hex2bin.exe生成的bin文件是否完成一致,我试过是一样的。

    qt工程源码:https://download.csdn.net/download/weixin_42653531/12629575

    展开全文
  • bin文件转换成hex文件

    热门讨论 2011-07-06 16:25:49
    机器码bin文件转换成16进制hex文件
  • bmp图片转换成bin文件

    热门讨论 2012-02-24 16:50:27
    BMP2RAW将bmp图片转换为bin文件,同时生产.c文件!
  • C语言读bin文件内容

    千次阅读 2020-07-20 18:50:35
    C语言读bin文件内容 一、直接上代码,我这里是读显示器edid的内容,read_bin_file.c #include<stdio.h> #include<string.h> #include"edid.h" typedef unsigned char u8; typedef unsigned long ...

                                    C语言读bin文件内容

     

    一、直接上代码,我这里是读显示器edid的内容,read_bin_file.c

    #include<stdio.h>
    #include<string.h>
    #include"edid.h"
    
    typedef unsigned char u8;
    
    typedef unsigned long int u32;
    
    
    /*************************************************************************************
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00: 03 50 08 21 01 13 01 00 00 00 00 01 01 00 00 00
    10: 01 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    20: 01 17 00 6f ff 00 00 00 10 00 ff 0f ff 02 19 0f
    30: 00 00 19 0b 00 00 02 03 00 00 09 00 00 0c 00 0a
    40: 00 0c 00 0c 00 07 00 0a 00 0c 00 00 00 7f 00 03
    50: 06 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    70: 00 cf 03 00 28 00 0c 1c 80 19 00 34 12 00 71 00
    80: 10 50 1f ac 00 40 00 20 40 00 00 00 00 00 00 00
    90: 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    *************************************************************************************/
    //TCL monitor
    unsigned char edid[255]={
    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x50, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x12, 0x13, 0x01, 0x03, 0x81, 0x52, 0x2e, 0x78, 0x0b, 0xd9, 0xb0, 0xa3, 0x57, 0x49, 0x9c, 0x25, 
    0x11, 0x49, 0x4b, 0xa9, 0xcf, 0x00, 0x95, 0x00, 0xb3, 0x00, 0x81, 0xc0, 0x81, 0x00, 0x81, 0x40, 
    0x81, 0x80, 0xa9, 0x40, 0xd1, 0xc0, 0x1b, 0x21, 0x50, 0xa0, 0x51, 0x00, 0x1e, 0x30, 0x48, 0x88, 
    0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1f, 0x00, 0x80, 0x51, 0x00, 0x1e, 0x30, 
    0x40, 0x80, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 
    0x00, 0x54, 0x43, 0x4c, 0x4d, 0x53, 0x36, 0x38, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x02, 
    0x02, 0x03, 0x20, 0xf1, 0x4d, 0x05, 0x02, 0x03, 0x04, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 
    0x16, 0x1f, 0x23, 0x09, 0x57, 0x07, 0x83, 0x01, 0x00, 0x00, 0x65, 0x03, 0x0c, 0x00, 0x10, 0x00, 
    0x8c, 0x0a, 0xd0, 0x8a, 0x20, 0xe0, 0x2d, 0x10, 0x10, 0x3e, 0x96, 0x00, 0x65, 0xcc, 0x21, 0x00, 
    0x00, 0x18, 0x01, 0x1d, 0x00, 0xbc, 0x52, 0xd0, 0x1e, 0x20, 0xb8, 0x28, 0x55, 0x40, 0x32, 0xcc, 
    0x31, 0x00, 0x00, 0x1e, 0x01, 0x1d, 0x80, 0xd0, 0x72, 0x1c, 0x16, 0x20, 0x10, 0x2c, 0x25, 0x80, 
    0x32, 0xcc, 0x31, 0x00, 0x00, 0x9e, 0x8c, 0x0a, 0xd0, 0x8a, 0x20, 0xe0, 0x2d, 0x10, 0x10, 0x3e, 
    0x96, 0x00, 0x32, 0xcc, 0x31, 0x00, 0x00, 0x18, 0x8c, 0x0a, 0xd0, 0x90, 0x20, 0x40, 0x31, 0x20, 
    0x0c, 0x40, 0x55, 0x00, 0x32, 0xcc, 0x31, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14
    };
    
    
    u32 GetBinSize(char *filename)  
    {     
        u32  siz = 0;     
        FILE  *fp = fopen(filename, "rb");     
        if (fp)   
        {        
            fseek(fp, 0, SEEK_END);        
            siz = ftell(fp);        
            fclose(fp);     
        }    
        printf("\nfilename=%s,size=%d \n",filename,siz);	
        return siz;  
    }
    
    void read_bin(char *path, u8 *buf, u32 size)  
    {  
        FILE *infile;  
          
        if((infile=fopen(path,"rb"))==NULL)  
        {  
            printf( "\nCan not open the path: %s \n", path);  
            exit(-1);  
        }  
        fread(buf, sizeof(u8), size, infile);
        fclose(infile);  
    } 
    
    int main(){
    	struct fb_videomode *mode, *m;
    	unsigned char *block;
    	int num = 0, i, first = 1,size=0;
    	unsigned char edid_data[1024];
    	size=GetBinSize("edid.bin");
    	
    	read_bin("edid.bin", edid_data,size);  
    	for(i=0;i<size;i++)
    	{	if (i % 16 == 0)
    				printf("\n");
    		printf("0x%02x,",edid_data[i]);
    	}
    	
    	printf("\nread edid completely!\n");
        return 0;
    }

    二、执行结果

    三、用notepad查看edid.bin

    四、用notepad查看和用程序读结果一样,测试ok。

    展开全文
  • 1、使用UltraEdit打开要转换的文件和转换后存放的文件,如下图: 左边为需要转换的文件,右边为转换后存放的文件。 2、选中要转换的文件—>以十六进制复制选定视图 3、复制到右边的文件 4、选中右边的文件,...
  • 【C++】 bin文件转换成txt文件

    千次阅读 2019-09-30 14:18:33
    因学习需要,现要将二进制bin文件转化成十六进制格式并保存于txt文件中。 使用C语言编写该程序较为简单,定义FILE指针,在合适的地方运用getc(),fprintf()函数即可。这里主要讲使用C++文件流方法。 一直以来对C++...
  • bin文件python读取

    千次阅读 2020-06-22 21:05:08
    bin文件python读取 读取流程为: bin --> open() as fid: --> file_ = fid.read(长度) --> tuple_data = struct.unpack("{长度}{格式化字符}", file_) # 其中Format Character可以从下图选择 --> ...
  • 生成Bin 、hex文件 Options->Output Converter->Output format Intel extended 就是Hex文件 Binary 就是Bin文件 生成的文件一般在project ->Debug->Exe文件夹下面
  • C程序读取一个Bin文件数据,然后存入另一个Bin文件 最近工作遇到需要bin文件数据处理,对程序语言其实不大熟悉,还是凭着一些浅显的C语言基础,各种折磨一天时间才实现了工作需求,好了,废话不多说,直接上正题; ...
  • 最近博主遇到一个小需求,需要将一个bin文件转换成C语言的数组,然后在代码里面操作这个数组,进行读写操作,最后生成另一个文件。 这个需求的核心是如何将bin转换成C语言的数组形式,本文将介绍以下4种方法: ...
  • 可执行bin文件的制作

    千次阅读 2018-12-19 09:37:43
    可执行bin文件的制作 大家如果安装过linux下的jdk安装包,可能使用过bin文件的安装方式。有没有好奇过bin文件是怎么制作出来的呢,在我们的工作中是不是也可以使用bin文件的格式来制作我们自己的安装包或者是升级包...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,944,226
精华内容 777,690
关键字:

bin文件