【问题标题】:PHP extract data from binary file with structurePHP从具有结构的二进制文件中提取数据
【发布时间】:2017-09-15 07:39:19
【问题描述】:

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

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) 数据数组。

谢谢。

【问题讨论】:

  • PHP 不擅长这种事情。如果可能的话,我建议切换到基于文本的格式,如 JSON 或 XML 甚至 CSV
  • 谢谢。任何。我只是想要一个可以导入回mysql的数据。 :) 如果你有办法做到这一点,不胜感激。我在编程方面没有太多经验......
  • 如果数据来自 MySQL,那么 MySQL 文本转储似乎是显而易见的解决方案!
  • 数据来自静态文件:(。谢谢。

标签: php binary extract unpack


【解决方案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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-26
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多