本文主要引用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取回
例如:
比如有个“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);
}
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛