php распаковать бинарную строку без unpack

156
12 апреля 2019, 11:50

Дана бинарная строка. В ней каждые 4 символа одно значение типа float в формате big-endian.

$binary_data; // здесь бинарные данные
$data_num = 3800; // целое значение - сколько байт данных
$bts_float = 4; // 4 символа на значение
for ($i = 0; $i < $data_num/$bts_float; $i++) {
    $tmpbuffer = '';
    $index=$i*$bts_float;
    $tmpbuffer .= $binary_data[$index+3];
    $tmpbuffer .= $binary_data[$index+2];
    $tmpbuffer .= $binary_data[$index+1];
    $tmpbuffer .= $binary_data[$index];
    array_push($result_array, unpack("f", $tmpbuffer));
}

Пока unpack("G*", $buffer); хоть как-то терпимо раскрывает, но это только для PHP 7.0+, а для 5.6 только примерным кодом выше.

Ошибка: {"1":-77.17456817626953},{"1":-77.43785858154297},{"1":-79.72053527832031}...

Вопрос: Всё-ли впорядке с кодом? Откуда взялась "1"?

в Python она распаковывается так: struct.unpack('!%df' % block, buffer), где block = количество значений / 4, buffer - бинарные данные

Answer 1

Как код написан, так он и работает. Предположу, что результат вы смотрите чем-то на подобии echo json_encode($result_array);

Так вот, если проверить документацию, то можно заметить, что функция unpack возвращает всегда массив. Есть возможность определить значения ключей массива в строке формата, но если ключи в строке формата не упомянуты - то unpack будет использовать простой счётчик параметров начиная с 1. Соответственно для строки формата из одного параметра результатом unpack будет ассоциативный массив с ключом 1 и значением - распакованным значением.

Если вам нужно только одно значение - то его в результат и переносите.

READ ALSO
Класс не найден

Класс не найден

Создаю сущность ORM, делаю все как описано тут и спотыкаюсь на первых шагахСоздаю класс по пути /home/bitrix/www/bitrix/modules/reaction/libs/reaction

157
Help me! Не добавляются данные в mysql

Help me! Не добавляются данные в mysql

Не могу найти ошибкуПишет: данные не добавлены

194
Php mailer не работает ( обратный связь )

Php mailer не работает ( обратный связь )

ВОт все скриты, и еще не работает маска для телефона, я всё сделал по инструкции ,форма после отправки выдаёт вот такую ошибку Доступ...

184