24bit int в php

Привет всем, поэтому я столкнулся с некоторой проблемой, с PHP мне нужно прочитать некоторые данные из двоичного файла, где SPACE имеет первостепенное значение, поэтому они использовали 24-битные целые числа.

Теперь для большинства данных я могу читать с распаковкой, однако pack/unpack не поддерживает 24-битный int: s

Я думал, что мог бы просто прочитать данные (скажем, например 000104) как H * и прочитать его в var, который будет правильным.

// example binary data say I had the following 3 bytes in a binary file
// 0x00, 0x01, 0x04

$buffer = unpack("H*", $data);

// this should equate to 260 in base 10 however unpacking as H* will not get
// this value.

// now we can't unpack as N as it requires 0x4 bytes of data and n being a 16 bit int
// is too short.

Кто-нибудь должен был иметь дело с этим раньше? Любые решения? советы?

2
задан Joe 22 июня '12 в 2:49
источник поделиться

1 ответ

Если файл имеет только 3 байта, как указано выше, самый простой способ - заполнить, как сказал @DaveRandom. Но если это длинный файл, этот метод становится неэффективным.

В этом случае вы можете прочитать каждый элемент как char и короткий, после этого переупаковать его побитовыми операторами.

Или вы можете читать по 12 байт как 3 longs, а затем разбивать на 4 группы по 3 байта с побитовыми операторами. Оставшиеся байты будут извлечены указанными выше методами. Это будет самое быстрое решение для больших данных.

unsigned int i, j;
unsigned int dataOut[SIZE];

for (i = 0, j = 0; j < size; i += 4, j += 3)
{
    dataOut[i]     = dataIn[j] >> 8;
    dataOut[i + 1] = ((dataIn[j] & 0xff) << 16) | (dataIn[j + 1] >> 16);
    dataOut[i + 2] = ((dataIn[j + 1] & 0xffff) << 8) | (dataIn[j + 2] >> 24);
    dataOut[i + 3] = dataIn[j + 2] & 0xffffff;
}

Следующий вопрос содержит пример кода для распаковки строки из 24/48 бит.

0
ответ дан phuclv 31 июля '13 в 7:37
источник поделиться

Другие вопросы по меткам