Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP将二进制字符串转换为二进制的有效方法_Php_Algorithm_Binary_Performance_Huffman Code - Fatal编程技术网

PHP将二进制字符串转换为二进制的有效方法

PHP将二进制字符串转换为二进制的有效方法,php,algorithm,binary,performance,huffman-code,Php,Algorithm,Binary,Performance,Huffman Code,下面是skinny(向下滚动查看问题):我正在使用PHP(针对项目)进行Huffman编码以压缩文件。我做了地图,把所有的东西都做成了一条线,就像这样: 00101010001100001110011101001101111011111011 现在,我需要把它转换成一个实际的二进制字符串,在它的当前状态下,它只是一个由1和0组成的字符串 下面是问题所在: 由1和0组成的字符串长度为17747595个字符,其速度实际上在550000左右 这是我的代码: <?php $i=0 $len =

下面是skinny(向下滚动查看问题):我正在使用PHP(针对项目)进行Huffman编码以压缩文件。我做了地图,把所有的东西都做成了一条线,就像这样:

00101010001100001110011101001101111011111011
现在,我需要把它转换成一个实际的二进制字符串,在它的当前状态下,它只是一个由1和0组成的字符串

下面是问题所在:

由1和0组成的字符串长度为17747595个字符,其速度实际上在550000左右

这是我的代码:

<?php

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

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

?>

我怎样才能使它足够高效地运行1700万字符的字符串


非常感谢您的支持

您不需要循环,您可以使用
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 

string'25648639.00'(长度=13)您看了吗@Yes,base_convert不会接受它,因为它太长:PDon不会将它全部写入变量,而是写入X字节后的某个文件缓存。这样,不是每次迭代都会加载整个字符串来追加接下来的几个字节。是的,编码的原始文件是4MB,然后通过Huffman分解到17m…我知道必须有一种有效的方法来做到这一点,我只是不知道它是什么lol。你为什么不尝试使用位流而不是位字符串?我的意思是从一开始就用8个字说再见。这是因为引用的位置。哇!我喜欢这种方法,但在GMP_init($string,2)中初始化GMP时,我似乎遇到了一个“分段错误”;你知道这是怎么回事吗?(是的,我安装了GMP:)什么版本的PHP和GMP?啊…我在PHP/5.2.10 GD/4.1.4上运行它,但我用PHP/5.4.7 GMP/4.3.2将它移到了我的服务器上,它工作起来很有魅力:)做得好!谢谢@Baba