У меня есть двоичный файл, состоящий из нескольких (+ 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;
}
По вашему опыту, был бы более быстрый подход?
Задача ещё не решена.
Других решений пока нет …