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

6

以下是简要情况(向下滚动查看问题):我正在使用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;
}

?>

如何使这个代码足够高效,以便运行含有1700万字符的字符串?

非常感谢您的支持!


1
你看过这个网址吗?https://dev59.com/9Gw15IYBdhLWcg3w0e8V - MagePal Extensions
1
是的,base_convert不接受它,因为它太长了:P - Addo Solutions
1
不要将整个字符串写入变量,而是在 X 字节后写入某个文件缓存。这样,在每次迭代中附加下几个字节时,不会加载整个字符串。 - feeela
@feeela,我其实是这样做的,只是不想在代码中添加那个 :) 它写在 $i % 2000。 - Addo Solutions
1
为什么你不尝试制作比特流而不是比特串呢?我的意思是从开头就使用8位字节。这是因为引用的局部性。 - morteza kavakebi
显示剩余3条评论
1个回答

5
您无需循环,可以使用gmppack
$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函数


哇!我喜欢那种方法,但是在gmp_init($string, 2)初始化GMP时似乎出现了“分段错误”,你有什么想法吗?(是的,我已经安装了GMP :)) - Addo Solutions
PHP和GMP的版本是什么? - Baba
啊...我之前在 PHP/5.2.10 GD/4.1.4 上运行它,但是现在我把它移到了我的服务器上,使用的是 PHP/5.4.7 GMP/4.3.2,现在它像魔法一样工作了 :) 做得好!感谢 @Baba - Addo Solutions

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接