利用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);

 

 

posted @ 2009-07-13 13:20  红袖添香  阅读(1832)  评论(1编辑  收藏  举报