2017-04-19 60 views
1

enter image description herePHP从结构的二进制文件提取数据

我有我的文件与图像结构。我想从中提取数据到数组:

function get_data($file, $number) 
{ 
    if(!$fp = fopen ($file, 'rb')) return 0; 
    $fsize = filesize($file); 
    if(!$data = fread ($fp, $fsize)) return 0; 
    $data_format= 
     '@100/'. 
     'smember_id/'. 
     'cmember_name_length/'. 
     'a' . $member_name_length . 'member_name/'. 
     'C100other_data/'; 
    $data = unpack ($data_format, $data); 
    fclose($file); 
    return $data; 
} 

如何从文件中获取$ member_name_length?我想创建一个函数,如果用户输入$ number,它将返回一个$ number(th)数据的数组。

谢谢。

+1

PHP是不是很擅长这种事情。如果可能,我建议切换到基于文本的格式,如JSON或XML甚至CSV – GordonM

+0

谢谢。随你。我只想要一个可以导入到mysql的数据。 :)如果你有办法做到这一点,赞赏。我没有太多的exp在编程... – Diamond

+0

如果数据来自MySQL然后MySQL文本转储似乎是明显的解决方案! – GordonM

回答

1

既然你有可变长度的数据块,就可以读取它们只能按顺序,所以为了读出第n个块,则需要阅读所有n个第一块:

function readDataBlock($f) { 
    $data = unpack('nmember_id', fread ($f, 2)); // I assume member_id is n, not s 
    if ($data['member_id'] == 0xFFFF) { 
     throw new \Exception('End of file'); 
    } 
    $data = array_merge($data, unpack('Cmember_name_length', fread ($f, 1))); //again, it must be C, not c, as I can't imagine negative length. 
    $data = array_merge($data, unpack('a*member_name', fread ($f, $data['member_name_length']))); // be sure you understand how a differs from A 
    return array_merge($data, unpack('C100other_data', fread ($f, 100))); // are you sure C100 is what you want here? 
} 


function get_data($file, $number) 
{ 
    if(!$fp = fopen ($file, 'rb')) return 0; 

    fread ($fp, 100); //skip header 

    for($n = 0; $n <= $number; $n++) { 
     $data = readDataBlock($fp); // read single member 
    } 

    fclose($fp); 
    return $data; //return the n-th member 
} 

如果文件是足够小,以适应内存,它可能会更好地阅读一次,并从内存返回第n个成员:

$data = []; 
while(true) { 
    try { 
     $data[] = readDataBlock($fp); 
    } catch(\Exception $e) { 
     break; 
    } 
} 


function get_data(&$data, $number) 
{ 
    return $data[$number]; 
} 
+0

谢谢!我正在尝试你的代码:) – Diamond

+0

它的工作原理。非常感谢:) – Diamond