2017-04-19 2 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로 ​​다시 가져올 수있는 데이터가 필요했습니다. :) 당신이 할 수있는 방법이 있다면, 감사하겠습니다. 프로그래밍에 많은 경험이 없습니다 ... – 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

관련 문제