+ -
当前位置:首页 → 问答吧 → 解压类 --简单、易懂

解压类 --简单、易懂

时间:2007-04-14

来源:互联网

复制PHP内容到剪贴板
PHP代码:
function ReadFileHeader(&$p_header){
        $v_binary_data = @fread($this->zip_fd, 4);
        $v_data = unpack('Vid', $v_binary_data);
        if ($v_data['id'] != 0x04034b50){
            return FALSE;
        }
        $v_binary_data = fread($this->zip_fd, 26);
        if (strlen($v_binary_data) != 26){
            $p_header['filename'] = "";
            $p_header['status'] = "invalid_header";
            return FALSE;
        }
        $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data);
        $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']);
        if ($v_data['extra_len'] != 0) {
            $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']);
        }else {
            $p_header['extra'] = '';
        }
        $p_header['version_extracted'] = $v_data['version'];
        $p_header['compression'] = $v_data['compression'];
        $p_header['size'] = $v_data['size'];
        $p_header['compressed_size'] = $v_data['compressed_size'];
        $p_header['crc'] = $v_data['crc'];
        $p_header['flag'] = $v_data['flag'];
        $p_header['filename_len'] = $v_data['filename_len'];
        $p_header['mdate'] = $v_data['mdate'];
        $p_header['mtime'] = $v_data['mtime'];
        if ($p_header['mdate'] && $p_header['mtime']){
            $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
            $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
            $v_seconde = ($p_header['mtime'] & 0x001F)*2;
            $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
            $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
            $v_day = $p_header['mdate'] & 0x001F;
            $p_header['mtime'] = mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
        }else{
            $p_header['mtime'] = time();
        }
        $p_header['stored_filename'] = $p_header['filename'];
        $p_header['status'] = "ok";
        return TRUE;
    }
    function ReadCentralFileHeader(&$p_header){
        $v_binary_data = @fread($this->zip_fd,4);
        $v_data = unpack('Vid', $v_binary_data);
        if ($v_data['id'] != 0x02014b50){
            return FALSE;
        }
        $v_binary_data = fread($this->zip_fd,42);
        if (strlen($v_binary_data) != 42){
            $p_header['filename'] = "";
            $p_header['status'] = "invalid_header";
            return FALSE;
        }
        $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data);
        if ($p_header['filename_len'] != 0){
            $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']);
        }else{
            $p_header['filename'] = '';
        }
        if ($p_header['extra_len'] != 0){
            $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']);
        }else{
            $p_header['extra'] = '';
        }
        if ($p_header['comment_len'] != 0){
            $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']);
        }else{
            $p_header['comment'] = '';
        }
        if ($p_header['mdate'] && $p_header['mtime']){
            $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
            $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
            $v_seconde = ($p_header['mtime'] & 0x001F)*2;
            $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
            $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
            $v_day = $p_header['mdate'] & 0x001F;
            $p_header['mtime'] = mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
        }else{
            $p_header['mtime'] = time();
        }
        $p_header['stored_filename'] = $p_header['filename'];
        $p_header['status'] = 'ok';
        if (substr($p_header['filename'], -1) == '/') {
            $p_header['external'] = 0x00000010;
        }
        return TRUE;
    }
    function ReadEndCentralDir(&$p_central_dir){
        $v_size = filesize($this->zipname);
        @fseek($this->zip_fd, $v_size);
        if (@ftell($this->zip_fd) != $v_size){
            return FALSE;
        }
        $v_found = 0;
        if ($v_size > 26) {
            @fseek($this->zip_fd, $v_size-22);
            if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)){
                return FALSE;
            }
            $v_binary_data = @fread($this->zip_fd, 4);
            $v_data = @unpack('Vid', $v_binary_data);
            if ($v_data['id'] == 0x06054b50) {
                $v_found = 1;
            }
            $v_pos = ftell($this->zip_fd);
        }
        if (!$v_found) {
            $v_maximum_size = 65557;// 0xFFFF + 22;
            if($v_maximum_size > $v_size){
                $v_maximum_size = $v_size;
            }
            @fseek($this->zip_fd, $v_size-$v_maximum_size);
            if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)){
                return FALSE;
            }
            $v_pos = ftell($this->zip_fd);
            $v_bytes = 0x00000000;
            while ($v_pos < $v_size){
                $v_byte = @fread($this->zip_fd, 1);
                $v_bytes = ($v_bytes << 8) | Ord($v_byte);
                if ($v_bytes == 0x504b0506){
                    $v_pos++;
                    break;
                }
                $v_pos++;
            }
            if ($v_pos == $v_size){
                return FALSE;
            }
        }
        $v_binary_data = fread($this->zip_fd,18);
        if (strlen($v_binary_data) != 18){
            return FALSE;
        }
        $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data);
        if ($v_data['comment_size'] != 0){
            $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']);
        }else{
            $p_central_dir['comment'] = '';
        }
        $p_central_dir['entries'] = $v_data['entries'];
        $p_central_dir['disk_entries'] = $v_data['disk_entries'];
        $p_central_dir['offset'] = $v_data['offset'];
        $p_central_dir['size'] = $v_data['size'];
        $p_central_dir['disk'] = $v_data['disk'];
        $p_central_dir['disk_start'] = $v_data['disk_start'];
        return TRUE;
    }
    function DisableMagicQuotes(){
        if ((!function_exists("get_magic_quotes_runtime"))||(!function_exists("set_magic_quotes_runtime"))){
            return TRUE;
        }
        if ($this->magic_quotes_status != -1) {
            return TRUE;
        }
        $this->magic_quotes_status = @get_magic_quotes_runtime();
        if ($this->magic_quotes_status == 1) {
            @set_magic_quotes_runtime(0);
        }
        return TRUE;
    }
    function SwapBackMagicQuotes(){
        if ((!function_exists("get_magic_quotes_runtime"))||(!function_exists("set_magic_quotes_runtime"))) {
            return TRUE;
        }
        if ($this->magic_quotes_status != -1) {
            return TRUE;
        }
        if ($this->magic_quotes_status == 1) {
            @set_magic_quotes_runtime($this->magic_quotes_status);
        }
        return TRUE;
    }
}
?>

作者: muqiao   发布时间: 2007-04-14

支持哦 学习中:)

作者: 纯色理想   发布时间: 2007-05-05

:') 直接看不懂啊`~~

作者: 17too   发布时间: 2007-06-02

钻的越来越深了!

作者: 木�^   发布时间: 2007-06-02

加点注释呀
看不懂,也就用不了,不会用的东西如何收藏~?~~

作者: quanhaier   发布时间: 2007-06-07

内部函数最好标注一下

作者: YYXX   发布时间: 2007-06-07

:L
直接昏了   好歹也分几个块啊   随便注释一下都可以啊  0.0

作者: fzm010   发布时间: 2007-06-07

注释!!

作者: wukeyuan   发布时间: 2007-06-09

我没那个好习惯

作者: muqiao   发布时间: 2007-06-09

PHP还有这功能哦????总算长见识了!!:lol :lol :lol

作者: yiqing666   发布时间: 2007-06-12