PHP hex文件及bin文件读取

背景:做物联网时经常会有软件上传这种操作,上传的软件包文件常见的是hex和bin这两种.

一 hex文件读取

  1 首先我们需要了解hex文件内容格式

  (图及下面说明来自网络,侵权必删)

  :(冒号)每个Intel HEX 记录 都由冒 号开头 ;
  LL 是 数 据 长 度域, 它 代表 记录当 中 数 据字 节 (dd) 的 数量 ;
  aaaa 是地址域, 它代表 记录当 中 数据的起始地址;
  TT是代表HEX 记录类 型的域 , 它 可能是以下 数 据 当 中的一 个:
    00 – 数 据 记录(Data Record)
    01 – 文件结 束 记录(End of FileRecord)
    02 – 扩展段地址 记录(ExtendedSegment Address Record)

    03 – 开始段地址 记录(Start Segment Address Record)
    04 – 扩展 线 性地址 记录(Extended Linear Address Record)    

    05 – 开始线性地址 记录(Extended Segment Address Record)
  DD 是数 据域 , 它 代表一 个 字 节 的 数 据. 一 个记录 可以有 许 多 数 据字 节 . 记录当 中 数 据字 节 的 数 量必 须 和数 据 长 度域(ll) 中指定的 数字相符.
  CC 是校验 和域 , 它 表示 这个记录 的校 验 和. 校 验 和的 计 算是通 过将记录当 中所有十六 进 制 编码数 字 对 的 值相加, 以256 为 模 进 行以下 补 足.

  表示为:“:[1字节长度][2字节地址][1字节记录类型][n字节数据段][1字节校验和] ”

  所以我们Php取内容的时候,可以按照"循环遍历每一行,字符串长度小于9或者第八第九位为01的,直接break;否则判断第八第九位是否为00,是的话就取值,否则continue"

  2 代码实例

            if($handle = fopen($_FILES["soft_file"]["tmp_name"], "r")){
                        $content = str_replace(array("\r\n", "\r", "\n", "\t", ‘ ‘), ‘‘, fgets($handle));
                        $data = ‘‘;
                        while ( strlen($content)  >= 9 && substr($content, 7,2)!=‘01‘) {
                            if(substr($content, 7,2)==‘00‘){
                                $data .= substr($content,9,-2);
                            }
                            $content = str_replace(array("\r\n", "\r", "\n", "\t", ‘ ‘), ‘‘, fgets($handle));
                        }

                        file_put_contents(".demo.v", $data);
                    }else{
                        exit(‘上传失败‘);
                    }

二 bin文件读取

一般和嵌入式软件那边协调都是bin文件直接读取,届时将内容传给硬件设备即可 

            move_uploaded_file($_FILES["soft_file"]["tmp_name"], ".demo.v")

三 设备下载软件包时简要说明

 (我们内部是16进制传输,各位按照自己的规则来做,这里做下参考)

    1当hex文件上传的时候,我们已经截取了字符串,所以只需要

            file_get_contents(".demo.v‘)

 2  当bin文件上传的时候,则需要转换下16进制

            $file_pointer = fopen(".demo.v‘, "rb");
            $file_read = fread($file_pointer, filesize(".demo.v‘));
            fclose($file_pointer);
            $data = bin2hex($file_read);

原文地址:https://www.cnblogs.com/bushuwei/p/11169086.html

时间: 2024-10-11 02:52:26

PHP hex文件及bin文件读取的相关文章

hex文件和bin文件区别

HEX文件和BIN文件是我们经常碰到的2种文件格式.因为自己也是新手,所以一直对这两个文件懵懵懂懂,不甚了解,最近在做STM32单片机的IAP更新,其中要考虑HEX文件和BIN文件,所以需要学习下这两种文件.下面是最近的我的了解,如有不对地方还请指正. HEX文件是包括地址信息的,而BIN文件格式只包括了数据本身 在烧写或下载HEX文件的时候,一般都不需要用户指定地址,因为HEX文件内部的信息已经包括了地址.而烧写BIN文件的时候,用户是一定需要指定地址信息的. HEX文件格式 HEX文件都是由

bin文件转换为hex文件C语言实现

对于嵌入式而言,hex文件可能大家再熟悉不过了,对,我们大学时学习的51单片机编写的代码在keil上编译后就生成了hex文件.那bin文件又是什么意思呢,它又和hex文件的区别在哪?这也不是本文的重点,下面简单的描述下: 最通俗的来讲,hex是带地址的,用下载器下载时,不需要设置偏移地址,它是文件流格式的,都是标准的ASCII码.而bin文件是不带地址的,全部是二进制数据流,打住一下,其实就是我们所谓的机器代码.有兴趣的同学,可以尝试着用反汇编,得到的就是汇编代码了.我所用的开发板S3C2440

HEX文件和BIN文件格式的区别

在单片机开发中HEX文件和BIN文件是非常常见的烧写文件格式,以常用开发环境Keil为例,分别创建HEX和BIN文件,比如: 1.创建HEX:在Keil里面可以通过勾选[魔法棒>Output>Creat HEX File]让工程输出HEX文件. 2.创建BIN:在Keil中在[魔法棒>User>After Build/Rebuild]标签下勾选Run #1,同时在其对应的User Command文本框中输入 fromelf --bin [email protected] !L 编译

C# 读写十六进制bin 文件

读一个十六进制的bin文件,在bin文件添加四行头,生成新的bin文件.bin文件可以用vs打开查看. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Ta

002_STM32学习笔记:【针对开发板】BIN文件通过ST-LINK烧录STM32芯片

由于本人所持的开发板STM32F429-DIS上面带有了ST-LINK下载烧录部分,而且这个型号的开发板在embed上也获得支持. 烧录文件:BIN文件 烧录方式:ST-LINK 烧录芯片:STM32F429I 烧录准备: 1.开发板自带的一根USB线 2.官方烧录软件:STM32 ST-LINK utility(下载需要登录账号) ================= 具体步骤: 1.安装烧录软件,后打开. 2.连接好开发板到电脑. 3.Target --> Connect (成功的结果) 4.

java 实现hex文件转换bin保存至内存中

hex 文件的格式,以文件中某一行字符串(16进制)为例: :10 0830 00 020C5D0224B3FFFFFFFFFFFFFFFFFFFF 7E 10,长度,转换成10进制,也就是16B 大小,这里是32个字符,因为16进制中,2个字符占一个字节,可以不管. 0830,地址,转换成10进制好计算,数据存入字节数组时,可以当做数组下标来使用,方便计算两个地址间的差值. 00,这里表示数据记录,还有其他类型百度便知,可以不管. 02...FF,数据部分.主要就是把这一部分转成bin文件.

hex文件快速转换为bin文件

我在stm32下面做信号分析,经常要将sram里的内存信号数据转为hex,又通过hex2bin.exe这个网上现成的转换软件进行转换为bin文件,这样数据才能在PC机器上做分析.每次都要在控制台下,输入转换命令,非常麻烦.于是就想到能不能直接对hex文件进行转换. 很容易想到在文件夹选项中设置对hex文件关联的程序,但直接使用hex2bin.exe ,由于它需要输入三个参数,默认只能使用一个参数,况且hex2bin对于输入参数有些要求,如文件名的长度不能超过8.没办法,我自己再写了一个控制台程序

读取bin文件,并且按结构体赋值打印

目标:读取一个bin文件,并且将bin文件中的数据,按字节对齐赋值给结构体,并且打印出结构体的内容 目前思路是简单的先将bin文件数据一次性读到一个数组中,再将数组强制转换为结构体 char buff[256] FILE *fp; fp = NULL; fp = fopen(argv[1], "rb"); if (NULL == fp) { printf( "The file was not opened\n"); return; } fread(buff, 1,

JSP/Servlet Web应用中.properties文件的放置与读取

本地项目在本地类库中,我经常使用当前目录来放置.properties文件,这时调用方只要引用我的jar,并且将我的.properties放在他的classpath里面即可,比如:p.load(new FileInputStream("HanLP.properties"));这样类似下图的项目结构就可以跑起来:JSP/Servlet Web项目但是到了Web项目时,情况大不相同.在Tomcat下,classpath里只含apache-tomcat-8.0.14\bin目录下有限的...