Subversion Repositories php-qbpwcf

Rev

Rev 226 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#!/usr/bin/php
<?php

/*
        QBPWCF, Quick Build PHP website Component base on Fedora Linux.
    Copyright (C) 2014~2026 MIN ZHI, CHEN

    This file is part of QBPWCF.

    QBPWCF is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    QBPWCF is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with QBPWCF.  If not, see <http://www.gnu.org/licenses/>.

*/

/*
逐一bytes比對兩個檔案有哪些bytes不同
*/

#使用命名空間qbpwcf
namespace qbpwcf;

#取得 lib path
exec("php -f ".escapeshellarg(pathinfo(__FILE__)["dirname"]."/libexec/folderOfUsrLib.php"),$output,$status);

#如果執行失敗
if($status!==0){

        #debug
        var_dump(__LINE__,$output);

        #結束執行,回傳shell 1.
        exit(1);

        }#if end

#儲存lib path
$folderOfUsrLib=$output[0];

#以該檔案的實際位置的 lib path 為 include path 首位
$output=array();
exec("cd ".escapeshellarg(pathinfo(__FILE__)["dirname"]."/../".$folderOfUsrLib."/qbpwcf").";pwd;",$output,$status);

#如果執行失敗
if($status!==0){

        #debug
        var_dump(__LINE__,$output);

        #結束執行,回傳shell 1.
        exit(1);

        }#if end

#設置 include path
set_include_path($output[0].PATH_SEPARATOR.get_include_path());

#匯入外部套件
include("allInOne.php");

#函式說明:
#抓取命令列的參數.
#回傳結果:
#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
#$reuslt["error"],執行不正常結束的錯訊息陣列.
#$result["function"],當前執行的函式名稱.
#$result["argu"],使用的參數陣列.
#$result["content"],要回傳的參數陣列.
#$result["count"],參數的數量.
#必填參數:
#無
#可省略參數:
#$conf["echo"],"true"代表要將抓到的參數一個個印出來,"false"代表用回傳的方式,預設為"false".
$conf["echo"]="false";
$getArgu=cmd::getArgu($conf);
unset($conf);

#如果抓參數出錯
if($getArgu["status"]==="false")
{
        #印出內容
        var_dump($getArgu);

        #結束執行
        exit;
}

#如果參數數量不等於3
if($getArgu["count"]!==3)
{
        #印出內容
        var_dump($getArgu);

        #結束執行
        exit;
}

#取得檔案A名稱
$fileNameA=$getArgu["content"][1];

#取得檔案B名稱
$fileNameB=$getArgu["content"][2];

#檔案A的pointer
$fhA=fopen($fileNameA,"r");

#檔案B的pointer
$fhB=fopen($fileNameB,"r");

#位置索引
$addr=0;

#無窮迴圈
while(true)
{
        #位置從1開始,且每次+1.
        $addr++;

        #若檔案A尚未結束
        if(!feof($fhA))
        {
                #取得 1 bytes
                $bytesA=fread($fhA,1);
        }

        #若檔案B尚未結束
        if(!feof($fhB))
        {
                #取得 1 bytes
                $bytesB=fread($fhB,1);
        }

        #兩邊都有資料時
        if( isset($bytesA) && isset($bytesB) )
        {
                #解析A成16進位大小文數字
                $bytesA=strtoupper(sprintf("%02s",base_convert(ord($bytesA),10,16)));

                #解析B成16進位大小文數字
                $bytesB=strtoupper(sprintf("%02s",base_convert(ord($bytesB),10,16)));

                #如果有差異
                if($bytesA!==$bytesB)
                {

                        echo "於第 ".$addr." 個bytes處相異,左方為:".$bytesA.";右方為:".$bytesB.PHP_EOL;
                        unset($bytesA);
                        unset($bytesB);
                        continue;
                }
        }

        #單邊有資料
        else
        {
                if(isset($bytesA))
                {
                        #解析A成16進位大小文數字
                        $bytesA=strtoupper(sprintf("%02s",base_convert(ord($bytesA),10,16)));

                        echo "於第 ".$addr." 個bytes處相異,左方為:".$bytesA.";右方不存在".PHP_EOL;
                        unset($bytesA);
                        continue;
                }

                else if(isset($bytesB))
                {
                        #解析B成16進位大小文數字
                        $bytesB=strtoupper(sprintf("%02s",base_convert(ord($bytesB),10,16)));

                        echo "於第 ".$addr." 個bytes處相異,左方不存在;右方為:".$bytesB.PHP_EOL;
                        unset($bytesB);
                        continue;
                }

                else
                {
                        break;
                }
        }
}

?>