PHP Эффективный способ преобразования строки двоичного файла в двоичный

вот тощий (прокрутите вниз, чтобы увидеть проблему): я использую кодировку Хаффмана для сжатия файла с использованием PHP (для проекта). Я сделал карту и превратил все в строку следующим образом:

00101010001100001110011101001101111011111011

Теперь мне нужно преобразовать это в настоящую двоичную строку, в ее текущем состоянии это всего лишь строка из 1 и 0.

Вот проблема:

Строка из 1 и 0 имеет длину 17 747 595 символов, и она действительно замедляется на отметке 550 000.

Это код, который у меня есть:

<?php

$i=0
$len = strlen($binaryString);

while ($i < $len){
    $section = substr($binaryString,$i,$i+8);
    $out .= chr(bindec($section));
    $i=$i+8;
}

?>

Как я могу сделать это достаточно эффективным для запуска строки из 17 миллионов символов?

Большое спасибо за любую поддержку!


person Addo Solutions    schedule 06.11.2012    source источник
comment
Вы посмотрели @ stackoverflow.com/questions/6382738/   -  person Renon Stewart    schedule 06.11.2012
comment
Да, base_convert не примет его, потому что он слишком длинный :P   -  person Addo Solutions    schedule 06.11.2012
comment
Записывать его не в переменную целиком, а в какой-то файловый кеш после X байт. Таким образом, не вся строка загружается на каждой итерации для добавления следующих нескольких байтов.   -  person feeela    schedule 06.11.2012
comment
Да, исходный кодируемый файл имеет размер 4 МБ, а затем разбивается с помощью Хаффмана на 17 м ... Я знаю, что должен быть эффективный способ сделать это, я просто не знаю, что это такое, лол.   -  person Addo Solutions    schedule 06.11.2012
comment
@feeela, на самом деле да, я просто не хотел загромождать код этим :) Он пишет $i % 2000   -  person Addo Solutions    schedule 07.11.2012
comment
Разве вы не можете сначала преобразовать его в десятичное или шестнадцатеричное, затем сделать то, что вам нужно, а затем преобразовать его обратно в двоичный? Кроме того, что вы пытаетесь сделать с двоичной строкой?   -  person Zappa    schedule 07.11.2012
comment
Обычно PHP должен запускать сборщик мусора для удаления неиспользуемых данных. Я бы попытался использовать unset( $out ); перед концом блока цикла и посмотреть, имеет ли это значение. Или используйте некоторую функцию fopen для чтения X байтов ввода, выполнения ваших действий и записи в другой файл. На каждой итерации должно использоваться только X байтов памяти.   -  person feeela    schedule 07.11.2012
comment
почему вы не попытались сделать битовый поток вместо битовой строки? я имею в виду просто использовать 8 бит до свидания с самого начала. это из-за локальности ссылки.   -  person morteza kavakebi    schedule 07.11.2012


Ответы (1)


Вам не нужно зацикливаться, вы можете использовать gmp с pack

$file = "binary.txt";
$string = file_get_contents($file);
$start = microtime(true);

// Convert the string
$string = simpleConvert($string);
//echo $string ;

var_dump(number_format(filesize($file),2),microtime(true)- $start);

function simpleConvert($string) {
    return pack('H*',gmp_strval(gmp_init($string, 2), 16));
}

Вывод

string '25,648,639.00' (length=13) <---- Length Grater than 17,747,595
float 1.0633520126343  <---------------- Total Conversion Time 

Ссылки

Примечание. Для решения требуются функции GMP.

person Baba    schedule 06.11.2012
comment
Вау! Мне нравится этот подход, но, похоже, я получаю ошибку сегментации при инициализации GMP в gmp_init($string, 2); есть идеи, о чем это? (Да, у меня установлен GMP :) - person Addo Solutions; 07.11.2012
comment
Какая версия PHP и GMP? - person Baba; 07.11.2012
comment
Ааа… Я запускал его на PHP/5.2.10 GD/4.1.4, но я перенес его на свой сервер с PHP/5.4.7 GMP/4.3.2, и он работает как шарм :) Молодец! Спасибо @Баба - person Addo Solutions; 07.11.2012