оптимизация — производительность парсинга двоичного потока php

У меня есть двоичный файл, состоящий из нескольких (+ 10К) записей по 6 байт каждая:

В качестве примера запишите строку байтов, подобную этой ÿvDV

Ascii : 152 + 118 + 68 + 86 + 27 + 15
Binary: 000100000101101100000010010100110000000000000000

Из строки я должен извлечь список «некоторых» битов в определенной позиции и затем привести их значение к целому числу:

1001100001110110 0100010001010110 0001101100001111
--     |-------| --     |-------| |------||------|
|          |      |          |        |       |
|          |      |          |        |       +------> 0001111     => $bin  = 1 5
|          |      |          |        +--------------> 00011011    => $site = 27
|          |      |          +-----------------------> 001010110   => $x    = 86
|          |      +----------------------------------> 01          => $dp   = 1
|          +-----------------------------------------> 001110110   => $y    = 118
+----------------------------------------------------> 10          => $tr   = 2

Есть ли более быстрый подход, чем этот?

$binary = file_get_contents("/path/to/binary/file.dat");
$startbyte = 0; //I'm reading 55nth byte
while($startbyte <= strlen($binary)) {
$record = unpack("n3", substr($binary, $startbyte, 6));
$info = array(
'tr'                => ($record[1] & 0xC000) >> 14,
'y'                 => ($record[1] & 0x01FF),
'dp'                => ($record[2] & 0xC000) >> 14,
'x'                 => ($record[2] & 0x01FF),
'site'              => (int) (($record[3] & 0x3F00) >> 8),
'bin'               => (int) ($record[3] & 0x003F) + 1)
);
$startbyte += 6;
}

По вашему опыту, был бы более быстрый подход?

1

Решение

Задача ещё не решена.

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector