zoukankan      html  css  js  c++  java
  • 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("
    ", "
    ", "
    ", "	", ' '), '', 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("
    ", "
    ", "
    ", "	", ' '), '', 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);
  • 相关阅读:
    java JDBC DAO ORM Domain
    《硅谷钢铁侠-- 埃隆·马斯克的冒险人生》
    在启动MYSQL时出现问题:“ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)”
    使用IntelliJ IDEA开发java web
    [django]用日期来查询datetime类型字段
    2020/5/31
    图解排序算法(三)之堆排序
    图解排序算法(二)之希尔排序
    图解排序算法(一)之3种简单排序(选择,冒泡,直接插入)
    Oracle约束(Constraint)详解
  • 原文地址:https://www.cnblogs.com/bushuwei/p/11169086.html
Copyright © 2011-2022 走看看