PHP извлекает данные из двоичного файла со структурой

введите описание изображения здесь

У меня есть файл со структурой в изображении. Я хочу извлечь данные в массив из этого:

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

Решение

Поскольку у вас есть блоки данных переменной длины, вы можете читать их только последовательно, поэтому для чтения 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];
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]