【问题标题】:PHP Efficient way to Convert String of Binary into BinaryPHP将二进制字符串转换为二进制的有效方法
【发布时间】:2012-10-26 20:04:36
【问题描述】:

这里是瘦的(向下滚动查看问题):我正在使用 Huffman 编码来压缩文件(用于项目)。我已经制作了地图,并将所有内容都变成了这样的字符串:

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 万个字符串?

非常感谢您的支持!

【问题讨论】:

  • 是的,base_convert 不会接受它,因为它太长了:P
  • 不要将其写入整个变量,而是写入 X 字节后的某个文件缓存中。这样,每次迭代都不会加载整个字符串来附加接下来的几个字节。
  • 是的,被编码的原始文件是 4MB,然后通过 Huffman 分解到 17m……我知道必须有一种有效的方法来做到这一点,我只是不知道它是什么,哈哈。
  • 你为什么不尝试制作比特流而不是比特串?我的意思是从一开始就使用 8 位再见。这是因为参考的位置。

标签: php algorithm binary performance huffman-code


【解决方案1】:

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

【讨论】:

  • 哇!我喜欢这种方法,但在 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
猜你喜欢
  • 2021-02-24
  • 1970-01-01
  • 2023-04-02
  • 2016-07-16
  • 1970-01-01
  • 2012-10-05
  • 2014-11-07
相关资源
最近更新 更多