2012-04-26 21 views
8

he estado buscando en los Internet y no podía encontrar una implementación de LZW de descompresión en PHP que funciona con los datos emitidos por estas funciones javascript:PHP LZW binario descompresión Función

function lzw_encode(s) { 
    var dict = {}; 
    var data = (s + "").split(""); 
    var out = []; 
    var currChar; 
    var phrase = data[0]; 
    var code = 256; 
    for (var i=1; i<data.length; i++) { 
     currChar=data[i]; 
     if (dict[phrase + currChar] != null) { 
      phrase += currChar; 
     } 
     else { 
      out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0)); 
      dict[phrase + currChar] = code; 
      code++; 
      phrase=currChar; 
     } 
    } 
    out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0)); 
    for (var i=0; i<out.length; i++) { 
     out[i] = String.fromCharCode(out[i]); 
    } 
    return out.join(""); 
} 

function lzw_decode(s) { 
    var dict = {}; 
    var data = (s + "").split(""); 
    var currChar = data[0]; 
    var oldPhrase = currChar; 
    var out = [currChar]; 
    var code = 256; 
    var phrase; 
    debugger; 
    for (var i=1; i<data.length; i++) { 
     var currCode = data[i].charCodeAt(0); 
     if (currCode < 256) { 
      phrase = data[i]; 
     } 
     else { 
      phrase = dict[currCode] ? dict[currCode] : (oldPhrase + currChar); 
     } 
     out.push(phrase); 
     currChar = phrase.charAt(0); 
     dict[code] = oldPhrase + currChar; 
     code++; 
     oldPhrase = phrase; 
    } 
    return out.join(""); 
} 

que realmente sólo necesitan una algoritmo de descompresión en PHP que puede funcionar con la función javascript de compresión anterior.

La función lzw_encode anterior codifica "Esta es una prueba de la función de compresión", como "Este es un una prueba ofĈhe comprĊsion functěn"

Las bibliotecas que he encontrado son o buggy (http: // código .google.com/p/php-lzw /) o no toma entrada de caracteres UTC.

Cualquier ayuda sería muy apreciada,

Gracias!

+1

¿Por qué no utilizar el JS de [enlace] (http://rosettacode.org/wiki/LZW_compression#JavaScript)? Hay implementaciones de PHP listas para eso en línea. Por ejemplo: [link] (http://webdevwonders.com/lzw-compression-and-decompression-with-javascript-and-php/). – BogdanM

+0

¿Por qué i = 1 aquí: 'for (var i = 1; i BogdanM

Respuesta

3

he portado y probado para que PHP:

function lzw_decode($s) { 
    mb_internal_encoding('UTF-8'); 

    $dict = array(); 
    $currChar = mb_substr($s, 0, 1); 
    $oldPhrase = $currChar; 
    $out = array($currChar); 
    $code = 256; 
    $phrase = ''; 

    for ($i=1; $i < mb_strlen($s); $i++) { 
     $currCode = implode(unpack('N*', str_pad(iconv('UTF-8', 'UTF-16BE', mb_substr($s, $i, 1)), 4, "\x00", STR_PAD_LEFT))); 
     if($currCode < 256) { 
      $phrase = mb_substr($s, $i, 1); 
     } else { 
     $phrase = $dict[$currCode] ? $dict[$currCode] : ($oldPhrase.$currChar); 
     } 
     $out[] = $phrase; 
     $currChar = mb_substr($phrase, 0, 1); 
     $dict[$code] = $oldPhrase.$currChar; 
     $code++; 
     $oldPhrase = $phrase; 
    } 
    var_dump($dict); 
    return(implode($out)); 
} 
+0

Recibí un montón de mensajes de error cuando probé esto. – quickshiftin

0

Ahora hay un PHP extension para esto!

lzw_decompress_file('3240_05_1948-1998.tar.Z', '3240_05_1948-1998.tar'); 
$archive = new PharData('/tmp/3240_05_1948-1998.tar'); 
mkdir('unpacked'); 
$archive->extractTo('unpacked'); 
+0

Eso es bueno, pero puede ser un poco difícil de usar, ya que obliga al uso de archivos. No puede simplemente descomprimir una cadena de datos. También requiere un formato de archivo .Z adecuado (esos 3 bytes al principio). – Veda

+0

Es de código abierto y cuesta medio día ... Planeo agregar soporte para cadenas si hay alguna necesidad expresada por la comunidad, o no dude en enviarme una solicitud de extracción;) Por cierto, es actualmente la mejor opción disponible para usuarios de PHP que desean compresión LZW, incluso si te obliga a usar archivos. – quickshiftin

Cuestiones relacionadas