利用PHP读取C语言Struct文件

本文主要引用http://blog.csdn.net/binger819623/archive/2009/07/01/4314585.aspxhttp://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);
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值