您现在的位置: 365建站网 > 365学习 > 利用PHP读取C语言Struct文件

利用PHP读取C语言Struct文件

文章来源:365jz.com     点击数:315    更新时间:2009-09-19 10:38   参与评论

本文主要引用http://blog.csdn.net/binger819623/archive/2009/07/01/4314585.aspx 及http://blog.csdn.net/binger819623/archive/2009/07/01/4314581.aspx

由于PHP为弱类型语言,没有对C语言中的Struct类型进行支持,因此利用PHP读取Struct结构的二进制文件比较困难。可用unpack函数来实现此功能,但过程较为复杂(引自xuzuning(唠叨))    
  1、你应该知道该结构的定义(每个成员的类型)  
  2、读取内容到串,依成员的类型截取相应长度的串到变量。串类型以"\0"结束  
  3、将截取到的非串类型的变量逐一用unpack函数依其类型进行解压。  
  unpack函数的参数请参见手册。其返回的是一个变异的数组而不是手册上说的是串,要用each取回

  例如:

  1. struct BIANBIAN {
  2.     char name[10];
  3.     char pass[33];
  4.     int  age;
  5.     unsigned char flag;
  6. };

  

比如有个“bianbian.org”文件,内容就是上面的N个BIANBIAN结构体构成的。读取的php代码:
//下面根据struct确定$format,注意int类型跟机器环境有关,我的32位Linux是4个长度

$format = 'a10name/a33pass/iage/Cflag';
//确定一个struct占用多少长度字节,如果只是读取单个结构体这是不需要的
$length = 10 + 33 + 4 + 1;
//也可以用fopen + fread + fclose,不过file_get_contents因为可以mmap,效率更高
$data = file_get_contents('bianbian.org', 'r');
for ($i = 0, $c = strlen($data); $i < $c; $i += $length) { 
    $bianbian = unpack("@$i/$format", $data);
    //reference传递是php 5才支持的,如果用php4,得用其他办法
    foreach ($bianbian as &$value) { 
        if (is_string($value)) { 
            $value = strtok($value, "\0");
        } 
    } 
    print_r($bianbian);

 

 

如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛

发表评论 (315人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
昵称:
最新评论
------分隔线----------------------------

快速入口

· 365软件
· 建站公司
· 杰创官网
· 建站工具

业务咨询

· 技术支持
· 服务时间:9:00-18:00
365建站网二维码

Powered by 365建站网 RSS地图 HTML地图

copyright © 2013-2022 版权所有 鄂ICP备17013400号-1